C語言和快速排序以及一些想法


#include<stdio.h>

int quick_sort(int num[], int left, int right);

int main(){
int li[] = {8,12,5,9,2,11,28,1,9,};
int n = sizeof(li)/sizeof(li[0]);

quick_sort(li,0,n-1);

int i;
for (i = 0;i<n;i++){
printf("數組第%d個數是%d\n",(i+1),li[i]);
}
return 0;
}

int quick_sort(int num[], int left, int right){
if (right <= left){
return 0;
}

int std = num[left];
int i = left;
int j = right;
int temp;

while(j > i){
while(j>i){
if(num[j] >= std){
j --;
}else{
num[i] = num[j];
num[j] = std;
break;
}
}
while(j > i){
if(num[i] < std){
i++;
}else{
num[j] = num[i];
num[i] = std;
break;
}
}
}

quick_sort(num,left,i);
quick_sort(num,i+1,right);
}

有價值的思考在用python實現快速排序后基本上都說了,C語言也沒什么好說的了。
時隔多日再次復現快速排序,一開始卡在怎么讓小於基准數的在一端,大於基准數的在一端。

我錯誤的思路:單純從一側比。。
比如說 8 9 10 4 5;
把8當做基准數,5比8小,則把5和8交換位置:5 9 10 4 8;
然后4和8比,又小,則再交換位置5 9 10 8 4;
10,9比8大,不動。。
然后又輪到5,最后變成了 8 9 10 5 4。。。。

正確的想法是,既然不要求較大組中是有序的,也就是最右邊的最大,那只要遇到比基准數大的,就放到最右邊。再朋友一個,放次右邊。較小組同理啊,只要碰到一個小的,就放到最左邊,再碰到一個,放到第二位。最后就會把基准數夾到了中間。
而由於把最左邊的數保存在了基准數中,結合挖坑思想,應該先找比它小的。
而這個比它小的,為何是從右邊找起呢?因為如果右邊第一個數比基准數大,那沒事兒,不懂它;或者看做原地挖坑原地埋,然后繼續向前找,假設倒數第二個比基准數小了,那就可以把它放到之前的那個坑中。你想,那倒數第二個數的值已經到了之前的坑里,它本身的位置就是一個坑了呀!這時候就又要找比基准數大的數去填充,然后再從左邊開找,找到一個比它小的去填充,這樣左邊又多了一個可以用來填從右邊找到的較小的數的坑~~這樣就形成了良性循環,最后兩邊就會在一個位置上撞上,從左邊找小的超過位置,碰到的都是比基准數大的,從右邊找大的超過這個位置,又都是小的。那這個位置就用來放基准數啦。
不過我這里漏掉了等於的情況,這個必須被左邊找過來或者右邊找過去的一個考慮。否則可能會陷入死循環。

而如果說把最左邊的數當做基准數,從左邊找起,首先要放在最左邊嘛,那肯定還要找一個比它小的。假設數0(坑0)是左邊第一個數,作為基准數它的值已經在std或者temp或者什么變量里了,所以可以填入其他東西。從左邊找起,假設數1比數0大,數2比數0小,那數2的值填到坑0里面,它自己變成了坑1。然而,此時基准數的位置應該在數0和數1之間了,請問要怎么樣才可以在數0和數1里面憑空挖出一個坑?這就必須把整組數據后移一個坑。。。所以這樣做是要不得的。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



快速排序(c語言) 快速排序(C語言) C語言------快速排序 快速排序(C語言) 快速排序(c語言) 快速排序-C語言 C語言快速排序 C語言快速排序 快速排序C語言 C語言:快速排序
 
粤ICP备14056181号  © 2014-2021 ITdaan.com