关于快速排序的一些看法,欢迎一起讨论
排序方法很多,特点各异,学习之后呢,又总是记不住(也可能是我记性不好)。静下心来,想想为什么我会记不住,可能是我在学习时,只是想着怎样按照书上给的方法去实现,通常是死记,而忽略了为什么要这样实现的基础性问题,以下是我对快速排序的一些看,欢迎大家一起讨论,加深理解。
按<<数据结构>>上所描述,实现如下方法:
void quicksort(int *,int,int);
main()
{
int sort[10]={8,6,1,0,3,0,4,2,7,9};
int i;
/*快速排序*/
quicksort(sort,0,9);
/*打印排序后的sort数组*/
for(i=0;i<10;i++)
printf("%d ",sort[i]);
putchar('\n');
}
void quicksort(int *sort,int i,int j)
{
int low=i;
int high=j;
int t,key=sort[low];/*key值一般是待排序数组的第一个元素*/
while(low < high)
{
/*从高位开始,向前搜索小于KEY的值*/
while(sort[high] >= key)
{
if(low >= high)
break;
else
high--;
}
/*从低位开始,向后搜索大于KEY的值*/
while(sort[low] <= key)
{
if(low >= high)
break;
else
low++;
}
if(low < high)
{
t = sort[high];
sort[high]=sort[low];
sort[low]=t;
}
else
{
sort[i]=sort[low];
sort[low]=key;
quicksort(sort,i,low-1);
quicksort(sort,low+1,j);
}
}
}
我提两个自己的问题,和对这些问题的理解:
问题1、为什么一定先从高位high向前搜索,再由低位low向后搜索?个人认为,先由high向前搜索会出现三种情况:
情况1:从high向前搜索到比KEY小的值,并且从low向后搜索到比KEY大的值,这时low<high,交换sort[high]和sort[low]。
情况2:从high向前搜索到比KEY小的值,但从low向后没有搜索到比KEY大的值,这时low==high、key<sort[low],交换sort[low]和key的值。
情况3:从high向前没有搜索到比KEY小的值(KEY就是最小值),这时low==high、sort[low]==sort[high]==key。
总结:对于情况2和情况3可以统一处理(当low==high,交换key和sort[low]的值,并重新递归调用快速排序函数)。
问题2、为什么不能先由低位low向后搜索,再从高位high向前搜索?个人认为,先由low向后搜索会出现三种情况,:
情况1:从low向后搜索到比KEY大的值,并且从high向前搜索到比KEY小的值,这时low<high,交换sort[high]和sort[low]。
情况2:从low向后搜索到比KEY大的值,但从high向前没有搜索到比KEY小的值,这时low==high、key<sort[low]。
情况3:从low向后没有搜索到比KEY大的值(KEY就是最大值),这时low==high,交换KEY和sort[high]。
总结:对于情况2和情况3不能统一处理。