1樓:monkey家園
常規的快速排序是這樣的:
1、從序列中選第一個關鍵字,作為篩選關鍵字。在此處為24
2、比24小的在24前面,比24大的在24後面
3、這樣就完成了第一趟排序
4、接著以後每趟都是把24前面的數和24及24後面的數分為兩塊,分別用以上步驟再排序一次。
5、直到所有粒度都為長度1或2(就是無序再劃分為止).
第一趟如下:
(24,19,32,43,38,6,13,22)
((24),19,32,43,38,6,13,22)
(19,(24),32,43,38,6,13,22)
(19,6,(24),32,43,38,13,22)
(19,6,13,(24),32,43,38,22)
(19,6,13,22(24),32,43,38)
第二趟(把24歸為左邊):
分割為兩部分:
(19,6,13,22,24 )(32,43,38)
分別用以上演算法:
((19),6,13,22,24 )((32),43,38)
(6,(19),13,22,24 )((32),43,38)
(6,13(19),22,24 )((32),43,38)
第二趟結束,第三趟把兩部分劃分進4部分:
(6,13(19),22,24 )((32),43,38)
(6,13,19)(22,24) (32) (43,38)
((6),13,19)((22),24) ((32)) ((43),38)
第三趟劃分了,但沒有可以篩選的,進入第四趟,把4部分劃分:
((6),13,19)((22),24) ((32)) ((43),38)
((6),13,19)((22),24) ((32)) ((43),38)
((6))((13),19) ((22))((24)) ((32)) ((43),38)
((6))((13),19) ((22))((24)) ((32)) ( 38,(43))
已經全部劃分到了最小粒度(每個部分最多2個或者1個資料)
這時候全部合併:
(6,13,19,22,24,32,38,43)
2樓:匿名使用者
你看看 */
#include
static int a[8] = ;
return i+1;
}void quicksort (int p, int r)}int main ()
/* 我空間裡還有一篇文章是關於qsort的,glibc裡的原始碼,我也沒怎麼看懂,感興趣可以研究下 */
剛才看了樓上給出的**,文章寫的不錯,裡面給的**對qsort的分析也很透徹,感覺人外有人,學習的路還很長阿。
3樓:冰棒之戀
首先取k1=24為基準,將比24大的關鍵碼移到後面去,將比24小的關鍵碼移到前面。為了節省空間,移動的方法可採用從兩端往中間夾入的方法,即先取出k1,空出前段第一個關鍵碼的位置。用k1,kn相比較,若kn>k1,則kn不動,繼續k1與kn-1的比較;若kn<=k1,則將kn移到k1的位置,空出kn的位置,這時用k1的值再與k2,k3,…相比,找出一個大於k1的關鍵碼,將它移動到後面剛空出的位置,如此往復。
自己用c++寫的快速排序法,不知道哪有問題,麻煩大家看看,謝謝了
4樓:瘋狂
你的partition函式錯了,其他部分都沒有問題。以下是我修改過的程式。
#include
using namespace std;
int partition(int* array,int left, int right)
}//while end
array[left]=array[r];
array[r]=pivotkey;
return r;
}void qsort(int* array, int left, int right)
}int main()
;qsort(array,0,5);
for(int i=0;i<6;i++)
cout< cout << endl; return 0; }程式出了問題,要學會除錯。首先,判斷哪個函式出錯了。然後,再針對出錯的函式進行除錯,發現問題。 qsort裡的partition是將arrary排列成: 小於等於array[left]數 <= arrary[left] < 大於array[left]的數。 檢查partition是否正確的方法是,直接在main函式裡呼叫它。如: int main() ;int mid = partition(array,0,5); cout << "mid=%d" << mid << endl; for(int i=0;i<6;i++) cout< cout << endl; return 0; }通過上面的main就可以看出partition裡while出錯了。然後,畫圖模擬l和r的移動,慢慢想想就可以分析出問題來。 5樓:【雨夜楓神 懶的看,這是我以前寫的,你自己對照看看吧 template inline void csort::quicksort(t x, int left, int right) while (x[--j] > pivot) {}if (i < j) swap(&x[i], &x[j]); else break; }swap(&x[i], &x[right - 1]); quicksort(x, left, i - 1); quicksort(x, i + 1, right); }else insertsort(x + left, right - left + 1); }好像沒給完 template inline void csort::insertsort(t x, const int n)} 6樓:匿名使用者 懶的看,這是我以前寫的,你自己對照看看吧 //快速排序 void quciksort(int a,int low,int high) include include using namespace std bool compare int a,int b int main i 注意a,不是a 20 int n sizeof a sizeof a 0 求取資料個數 for i 0 i n i cout a i endl cout 排... 由於你傳遞的l是值傳遞,在快速排序內部出現了一個名字一樣的區域性變數,只是區域性變數被排序了,並不是傳入的變數被排序,可以採用傳地址的方式解決,或者不定義形參,直接採用全域性變數。我使用前者幫你實現了 再者,快速排序 有點問題,幫你修改了下 include include define maxsiz... 如下 class program static void main string args 個同學的分數 i array i 1 int.parse console.readline sort array console.writeline n 成績排序結果如下 for int i 0 i arra...Csort排序過程中遇到的問題,關於c 用sort函式 降序排序的小問題?
資料結構快速排序問題,C語言資料結構 快速排序的問題
C氣泡排序,c 關於氣泡排序法的簡單程式碼