啥是快排
快排就是选定一个基准元素pirot,经过一趟排序后,使得pirot前面的元素都比它小,pirot后面的元素都比它大,之后以pirot为界,分为两部分数据,按刚才的方法对这两部分数据分别快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
一趟快排
假定对有N个元素的数组 arr 进行快排
1)设置两个变量i、j,排序开始的时候i:=1,j:=N;
2)以第一个数组元素arr[0]作为基准元素,赋值给pirot,即pirot:=arr[0];
3)从j开始向前搜索,即由后开始向前搜索,只要j大于pirot, j:=j-1,一旦找到第一个小于pirot的值,两者交换,然后把主动权交给i,让i跑;
4)从i开始向后搜索,即由前开始向后搜索,只要i小于pirot, i:=i-1,一旦找到第一个大于pirot的值,两者交换,然后把主动权交给j,让j跑;
5)重复第3、4步,直到 i=j ;
例如,对32 12 7 78 23 45进行第一趟排序
代码如下
#include<stdio.h>
int arr[6] = {32 ,12 ,7 ,78, 23, 45};
void quiksort(int a[],int low,int high)
{
int i = low;
int j = high;
int temp = a[i];
if( low > high)
{
return ;
}
while(i < j)
{
while((a[j] >= temp) && (i < j))
{
j--;
}
a[i] = a[j];
while((a[i] <= temp) && (i < j))
{
i++;
}
a[j]= a[i];
}
a[i] = temp;
quiksort(a,low,i-1);
quiksort(a,j+1,high);
}
void main()
{
int i;
quiksort(arr,0,5);
for(i=0;i<6;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
要注意递归的出口是low==high,所以当
` ``
if(low>high){
return;
}
每天都努力一点点
谢谢你看完
***
网友评论