参考了网上大神的理解后,自己也尝试着写下传说中的“快速排序”。
参考链接:https://blog.youkuaiyun.com/morewindows/article/details/6684558
大致思路总结为:挖坑填坑+分治法。
举个例子:我们对数组a[9]={6,2,4,3,7,1,5,0,8}进行分析。
首先我们拿数组中的随机一个数作为基准数(参照对象,也就是要挖的坑),把基准数变成坑(用“X”来表示),然后我们把它和数组的第一个数位置交;,比如我们拿到的基准数为5,那么新数组顺序变为
X 2 4 3 7 1 6 0 8
然后我们从最右边开始找,找到第一个比X小的数,我们找到了0,然后把0赋值给X,(我们不把这两个数进行交换操作的原因是为了代码简洁并且提高程序效率),这样0的位置就变成了一个新坑X,记为
0 2 4 3 7 1 6 X 8
然后我们从0的下一个位置开始,找到第一个比X大的数,我们找到7,然后把7赋值给X,然后7的位置变成新坑,记为
0 2 4 3 X 1 6 7 8
然后我们从7的下一个位置开始,找到第一个比X小的数,找到1,把1赋值给X,1变X,记为
0 2 4 3 1 X 6 7 8
然后我们发现1的下一个位置和坑X的位置是一样的,那么,我们就把基准数5填到坑X里。这样,我们已经把比基准数大的数全部放到了基准数的右边,比它小的全部放到了左边;记为
0 2 4 3 1 5 6 7 8
然后我们分别对基准数的左边和右边的子数组再进行挖坑填坑,直到最后的子数组里只有一个元素。
代码如下:
void quick_sort(int a[],int left,int right){
if(left<right){
srand(time(NULL));
int k=left+rand()%(right-left+1);
swap(a[k],a[left]);
int x=a[left],i=left,j=right;
while(i<j){
while(i<j&&a[j]>=x)
j--;
if(i<j)
a[i++]=a[j];
while(i<j&&a[i]<x)
i++;
if(i<j)
a[j--]=a[i];
}
a[i]=x;
quick_sort(a,left,i-1);
quick_sort(a,i+1,right);
}
}