快速排序的实现与注意点
先上實(shí)現(xiàn)了的C++代碼:
1 #include <ctime> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <iostream> 5 using namespace std; 6 const int maxn = 100; 7 int a[maxn], n; 8 void quick_sort(int left, int right) { 9 if(left > right) { 10 return; 11 } 12 int i = left, j = right, key = a[left]; 13 while(i != j) { 14 while(i < j && a[j] >= key) { 15 j--; 16 } 17 //尋找分界點(diǎn)右邊比key小的數(shù) 18 while(i < j && a[i] <= key) { 19 i++; 20 } 21 //尋找分界點(diǎn)左邊比key大的數(shù) 22 if(i != j) { 23 swap(a[i], a[j]); 24 } 25 //如果找到了,則交換 26 } 27 swap(a[left], a[i]); 28 //將key放到分界點(diǎn)的位置上,之后進(jìn)行遞歸處理分界點(diǎn)兩側(cè)的數(shù)據(jù) 29 quick_sort(left, i - 1); 30 quick_sort(i + 1, right); 31 } 32 int main() { 33 scanf("%d", &n); 34 srand((unsigned)time(NULL)); 35 for(int i = 0; i < n; i++) { 36 a[i] = rand() % 1000; 37 } 38 quick_sort(0, n - 1); 39 for(int i = 0; i < n; i++) { 40 printf("%d ", a[i]); 41 } 42 printf("\n"); 43 return 0; 44 }
?
下邊說(shuō)說(shuō)兩個(gè)注意點(diǎn):
(1)關(guān)于quick_sort函數(shù)第一句,為什么要判斷l(xiāng)eft是否大于right?
考慮這樣一組輸入數(shù)據(jù):
10
279 786 373 946 460 552 698 754 519 759
這組數(shù)據(jù)就是為什么要有if(left > right)的原因,因?yàn)榈谝惠喯聛?lái)以后,i、j均為0(279比其他所有數(shù)都小),之后遞歸處理的時(shí)候,左邊的區(qū)間為(0, -1),不合法!
(2)為什么每一輪查找左右兩部分的時(shí)候,都要從右端開(kāi)始(下標(biāo)j)?
每一輪兩邊找的時(shí)候,都從右邊開(kāi)始的原因是為了保證最終a[i]和a[left]交換的時(shí)候,a[i]>=a[left]
比如考慮這樣一組數(shù)據(jù):
6
7 1 2 3 4 8
這樣如果從左邊先找,第一輪下來(lái)后,將會(huì)使得i為5,交換a[0]和a[5],左邊區(qū)間為0-4,右邊沒(méi)有,但是左邊區(qū)間有一個(gè)8,比7大!
轉(zhuǎn)載于:https://www.cnblogs.com/wannafly1995/p/8074187.html
總結(jié)
以上是生活随笔為你收集整理的快速排序的实现与注意点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 爱爱爱爱你是什么歌啊?
- 下一篇: 使用 GDB 调试多进程程序