快速排序(递归与⾮递归)c语⾔实现
、算法设计原理分析
快速排序是对冒泡排序的⼀种改进,快速排序的基本思想是:通过⼀趟排序将要排序的数据分割成独⽴的两部分,其中⼀部分的所有数据⽐另⼀部分的所有数据要⼩,再按这种⽅法对这两部分数据分别进⾏快速排序,整个排序过程可以递归进⾏,使整个数据变成有序序列。论坛网站框架
基本步骤为:1)先从数列中取出⼀个数作为基准数;2)分区过程,将⽐这个数⼤的数全放到它的右边,⼩于或等于它的数全放到它的左边。3)再对左右区间重复第⼆步,直到各区间只有⼀个数。
⾮递归实现⽅法,需要把递归实现中函数调⽤部分换为迭代中调⽤函数,这⾥就可以⽤队列,或者栈来保存每次递归中的开始位置和结束位置,从⽽,可以在每次快排结束后,从队列,或者栈中跳出⼀组开始、结束位置下标,再进⾏快排,直到队列或者栈为空时停⽌。我采⽤了栈来保存开始、结束的位置,每次都先进⾏左边的快排,所以在对位置进栈操作时,先把右边的开始、结束标记位置推⼊栈,再把左边的推⼊栈
2、程序设计
递归实现:
#include<stdio.h>
#include<stdlib.h>
void QuickSort_GetKey(double *p,int len);
void QuickSort_Recursion(double *p,int len);
int main()
{
int i;
double arr[]={-34,4,0,6000.354,5.43,-343.23};
int n=sizeof(arr)/sizeof(double);
printf("排序前的数组为:\n");
for(i=0;i<n;i++)
printf("%lf ",arr[i]);
QuickSort_Recursion(arr,n);
printf("\n快速排序后的数组为:\n");
for(i=0;i<n;i++)
printf("%lf ",arr[i]);
return 0;
}
void QuickSort_Recursion(double *p,int len) //定义递归⽅式的快速排序算法函数
{
int i=0,j=len-1;
QuickSort_GetKey(p,len-1);
QuickSort_GetKey(p,len-1);
if(len<=1)
return;
double key=p[j]; //选取⼀个关键字(key)作为枢轴
while(i<j)
{
while(i<j&&p[i]<key)
{
i++;
}
p[j]=p[i];
borderlands3多少内存
while(i<j&&p[j]>key)
{
j--;
}
p[i]=p[j];
}
p[i]=key;
QuickSort_Recursion(p,j); //对前⼀⼦数组进⾏快速排序
QuickSort_Recursion(p+j+1,len-j-1); //对后⼀⼦数组进⾏快速排序
}
void QuickSort_GetKey(double *p,int len) //定义枢纽的函数,取前中末三数的中位数作为枢纽放末尾{
int tem;
if(p[0]>p[len/2])
{
tem=p[0];
p[0]=p[len/2];
p[len/2]=tem;
}
if(p[0]>p[len])
{
duplicate entry报错tem=p[0];
p[0]=p[len];
p[len]=tem;
}
if(p[len/2]<p[len])
{
tem=p[len/2];
p[len/2]=p[len];
p[len]=tem;
}
}
⾮递归⽅式实现:
#include<stdio.h>
#include<stdlib.h>
void quickSort(int *arr, int size);冒泡排序代码c语言
int QuickSort_Getposition(int *arr, int begin, int end);
typedef struct Stack //定义结构体栈
{
int *data;
int size;
}stack;
void InitStack(stack *s) //初始化栈
{
int *data = (int*)malloc(20 * sizeof(int)); //申请开辟⼀个长度为20的数组空间 if (data == NULL) //若申请不到,则报错退出
{
return;
}
s->data = data;
s->size = 0;
}
void PushStack(stack *s,int d) //⼊栈函数
{
if (s->size > 20) //若栈满了就返回
{
return;
}
else
s->data[s->size++] = d;
}
void PopStack(stack *s) //出栈函数
{
if (s->size == 0) //若栈⾥没有数据就返回
{
return;
}
elseandroid应用程序开发实验报告
s->size--;
}
int TopStack(stack *s) //显⽰栈尾的内容
{
return s->data[s->size-1];
}
int EmptyStack(stack *s) //判断栈是否为空的函数{
return(s->size==0);
}
void Print(int *arr, int size) //打印函数
{
int i = 0;
for (i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int MiddleNumber(int *arr, int begin, int end) {
int mid = begin + ((end - begin) /2);
if (arr[begin] > arr[mid])
{
if (arr[begin] > arr[end])
{
if (arr[mid] > arr[end])
{
return mid;
}
else
return end;
}
else
buttord函数return begin;
}
else
{
if (arr[mid] > arr[end])
{
if (arr[begin] > arr[end])
{
return begin;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论