思路:将第一次Qsort单独列出来,因为只有第一次的pivot取值与Qsort函数中对于pivot的取值是不同的。
整体来讲需要写3个函数:
Qsort函数,取pivot将其放在需要比较的数组的最后一个(也就是原数组的倒数第二个,因为原数组的最后一个在取pivot的时候已经比较完成,其值一定大于pivot),i从第二个数开始后移(原数组的第一个数在取pivot时也已经完成比较,一定比pivot小),如果大于pivot则停下,j从pivot所处位置的前一个开始前移(也就是原数组的倒数第三位),如果小于pivot就停下;如果i<j,则交换,否则将i相对应的数的大小与pivot相比较,更大的放在原数组的倒数第二位上
Median3函数:选择数组的首位,末位,中间位,相互比较大小,去中间值为pivot,并将其按照大小顺序以此放在数组首位、末位、倒数第二位上,便于后续调用数据
Insertionsort函数:在数据量较小时,使用插入排序会快于qsort
其他具体解释在代码里:
#include <stdio.h>
#include <stdlib.h>
void Qsort(int *number, int left, int right);
int Median3(int *number,int left, int right);
void Insertionsort(int *number, int left, int N);
int main()
{
int number[11];
int n;
int pivot;
int temp;
int left=0;
int right=9;
int i,j;
scanf("%d",&n);//由题,n为给定的第一次排序的pivot//
number[0]=49;
number[1]=38;
number[2]=65;
number[3]=97;
number[4]=76;
number[5]=13;
number[6]=27;
number[7]=50;
number[8]=2;
number[9]=8;
number[10]=0;
pivot = number[n];//将第一次的pivot与末位交换//
number[n]=number[right];
number[right]=pivot;
if(left+3<=right)//如果数据量可以使用Qsort//
{
printf("Qsort(%d,%d):",left,right);
i=left-1;//第一次排序的特殊点在于给定了pivot,我们还没有比较它和首位的大小,所以这里的i是从-1开始的(后续我们需要使用++i)//
j=right;//原因同上,j从最后一个开始,因为要使用--j//
for(; ;)
{
while(number[++i]<pivot){}
while(number[--j]>pivot){}
if(i<j)
{
temp=number[i];
number[i]=number[j];
number[j]=temp;
}
else
{
break;
}
}
if(pivot<number[i])//找到pivot所处的位置//
{
temp=number[i];
number[i]=number[right];
number[right]=temp;
}
}
for(int d=0;d<10;d++)
{
printf("%d,",number[d]);
}
printf("\n");
//printf("here:%d:::",i-1);
Qsort(number,left,i-1);//左侧排序//
//printf("now:");
Qsort(number,i+1,right);//右侧排序//
return 0;
}
int Median3(int *number,int left, int right)
{
int center=(left+right)/2;
int temp;
if(number[left]>number[center])
{
temp=number[left];
number[left]=number[center];
number[center]=temp;
}
if(number[left]>number[right])
{
temp=number[left];
number[left]=number[right];
number[right]=temp;
}
if(number[center]>number[right])
{
temp=number[center];
number[center]=number[right];
number[right]=temp;
}
temp=number[center];
number[center]=number[right-1];
number[right-1]=temp;
return number[right-1];
}
void Qsort(int *number, int left, int right)
{
int i,j;
int temp;
int pivot;
if(left+3<=right)
{
pivot=Median3(number,left,right);
i=left;
j=right-1;
for(; ;)
{
while(number[++i]<pivot){}
while(number[--j]>pivot){}
if(i<j)
{
temp=number[i];
number[i]=number[j];
number[j]=temp;
}
else
{
break;
}
}
if(pivot<number[i])
{
temp=number[i];
number[i]=number[right-1];
number[right-1]=temp;
}
printf("Qsort(%d,%d):",left,right);
for(int k=0;k<10;k++)
{
printf("%d,",number[k]);
}
printf("\n");
Qsort(number,left,i-1);
Qsort(number,i+1,right);
}
else
{
if(left==right)
{
printf("insert(%d,%d):",left,right-left+1);
for(int k=0;k<10;k++)
{
printf("%d,",number[k]);
}
printf("\n");
}
else
{
Insertionsort(number,left,right-left+1);
}
}
}
void Insertionsort(int *number, int left, int N)
{
int j,p;
int tmp;
for(p=left+1;p<N+left;p++)
{
tmp=number[p];
for(j=p;j>left&&number[j-1]>tmp;j--)
{
number[j]=number[j-1];
}
number[j]=tmp;
}
printf("insert(%d,%d):",left,N);
for(int k=0;k<10;k++)
{
printf("%d,",number[k]);
}
printf("\n");
}