轉載自 這裡 (Gossip@Caterpillar)
前言 :
在 快速排序法(一) 中,每次將最左邊的元素設為軸,而之前曾經說過,快速排序法的加速在於軸的選擇,在這個例子中,只將軸設定為中間的元素,依這個元素作基準進行比較,這可以增加快速排序法的效率.
解法 :
在這個例子中,取中間的元素s作比較,同樣的先得右找比s大的索引 i,然後找比s小的索引 j,只要兩邊的索引還沒有交會,就交換 i 與 j 的元素值,這次不用再進行軸的交換了,因為在尋找交換的過程中,軸位置的元素也會參與交換的動作,例如:
41 24 76 11 45 64 21 69 19 36
首先left為0,right為9,(left+right)/2 = 4(取整數的商),所以軸為索引4的位置,比較的元素是45,您往右找比45大的,往左找比45小的進行交換:
完成以上之後,再初別對左邊括號與右邊括號的部份進行遞迴,如此就可以完成排序的目的
演算法範例代碼 :
* SortQuick2.h 代碼 :
* SortQuick2.cpp 代碼 :
* 呼叫Sorting 代碼 :
執行結果 :
前言 :
在 快速排序法(一) 中,每次將最左邊的元素設為軸,而之前曾經說過,快速排序法的加速在於軸的選擇,在這個例子中,只將軸設定為中間的元素,依這個元素作基準進行比較,這可以增加快速排序法的效率.
解法 :
在這個例子中,取中間的元素s作比較,同樣的先得右找比s大的索引 i,然後找比s小的索引 j,只要兩邊的索引還沒有交會,就交換 i 與 j 的元素值,這次不用再進行軸的交換了,因為在尋找交換的過程中,軸位置的元素也會參與交換的動作,例如:
41 24 76 11 45 64 21 69 19 36
首先left為0,right為9,(left+right)/2 = 4(取整數的商),所以軸為索引4的位置,比較的元素是45,您往右找比45大的,往左找比45小的進行交換:
完成以上之後,再初別對左邊括號與右邊括號的部份進行遞迴,如此就可以完成排序的目的
演算法範例代碼 :
* SortQuick2.h 代碼 :
- #include "main.h"
- #include "Basic.h"
- #define MAX_SORT_QUICK2_LEN 11
- /*
- * Source : http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/QuickSort2.htm
- */
- void quickSort2(int num[], int len);
- void _quickSort2(int num[], int left, int right, int len);
- #include "SortQuick2.h"
- void quickSort2(int num[], int len) {
- _quickSort2(num, 0, len-1, len);
- }
- void _quickSort2(int num[], int left, int right, int len){
- if(left < right) {
- int i=left-1;
- int j=right+1;
- int s = num[(left+right)/2];
- while(1) {
- while(num[++i]
- while(num[--j]>s);
- if(i>=j)
- break;
- SWAP(num[i],num[j]);
- }
- _quickSort2(num, left, i-1, len);
- _quickSort2(num, j+1,right, len);
- }
- }
- int num[MAX_SORT_QUICK2_LEN];
- getRandomArray(num, MAX_SORT_QUICK2_LEN);
- cout << "Original Array: " << endl;
- printArray(num, MAX_SORT_QUICK2_LEN);
- quickSort2(num, MAX_SORT_QUICK2_LEN);
- cout << "After Quick2 Sorting: " << endl;
- printArray(num, MAX_SORT_QUICK2_LEN);
執行結果 :
This message was edited 2 times. Last update was at 17/02/2010 00:55:35
沒有留言:
張貼留言