關於C 中快速排序的問題,大家來看看啊

時間 2021-10-14 21:04:31

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)

Csort排序過程中遇到的問題,關於c 用sort函式 降序排序的小問題?

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 排...

資料結構快速排序問題,C語言資料結構 快速排序的問題

由於你傳遞的l是值傳遞,在快速排序內部出現了一個名字一樣的區域性變數,只是區域性變數被排序了,並不是傳入的變數被排序,可以採用傳地址的方式解決,或者不定義形參,直接採用全域性變數。我使用前者幫你實現了 再者,快速排序 有點問題,幫你修改了下 include include define maxsiz...

C氣泡排序,c 關於氣泡排序法的簡單程式碼

如下 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...