"希爾排序法" 是 D.L. Shell 在 1959 年 7 月所發明的一種排序法, 而該排序法是直接以發明者命名. 其排序原理有點像是插入排序法, 但它可以減少資料搬移的次數. 排序的原則是將資料區分成特定間隔的幾個小區塊, 接著以插入排序法排完區塊內的資料後再漸漸減少間隔的距離.
演算法說明 :
請考慮右邊元素, 並使用 Shell 演算法由小到大排序 : 6 9 2 3 4 7 5 1
第一次掃描 : 間隔為 8/2=4 : 6 9 2 3 4 7 5 1
6 4 -> 4 6
9 7 -> 7 9
2 5 -> 2 5
3 1 -> 1 3
掃描完結果 : 4 7 2 1 6 9 5 3
第二次掃描 : 間隔為 8/2/2=2 : 4 7 2 1 6 9 5 3
4 2 6 5 -> 2 4 5 6
7 1 9 3 -> 1 3 7 9
掃描完結果 : 2 1 4 3 5 7 6 9
第三次掃描 : 間隔為 8/2/2/2 = 1 : 2 1 4 3 5 7 6 9
2 1 4 3 5 7 6 9 -> 1 2 3 4 5 6 7 9
掃描完結果 : 1 2 3 4 5 6 7 9
希爾演算法分析 :
範例代碼 :
- #include
- #include
- using namespace std;
- struct BenchMark {
- int swapTime; // Swap Time
- int verifyTime; // Verify Time
- double cTime; // Consumed Time
- };
- BenchMark shellSort(int data[], int n) {
- int cnt=0, vt=0, jump = n/2, j;
- BenchMark bm;
- bool in = false;
- while(jump>0) {
- for(int i=jump; i
- for(int k=i; k
- j = i-jump;
- in = false;
- while(j>=0 && data[j+jump]
- in = true;
- cnt++;
- vt++;
- int tmp = data[j+jump];
- data[j+jump] = data[j];
- data[j] = tmp;
- j-=jump;
- }
- if(!in) {
- vt++;
- }
- }
- }
- jump = jump/2;
- }
- bm.swapTime = cnt;
- bm.verifyTime = vt;
- return bm;
- }
- void _inputData(int data[], int size) {
- for(int i=0; i
- cout << "請輸入第" << i+1 << " 個元素: ";
- cin >> data[i];
- }
- }
- void _showData(int data[], int size) {
- for(int i=0; i
- printf("%2d ", data[i]);
- }
- printf("\n");
- }
- #define SHELL_DATA_SIZE 5
- void main(bool b) {
- if(b) {
- int data[SHELL_DATA_SIZE];
- _inputData(data, SHELL_DATA_SIZE);
- printf("原始資料為: ");
- _showData(data, SHELL_DATA_SIZE);
- BenchMark bm = shellSort(data, SHELL_DATA_SIZE);
- cout << "希爾排序: " << endl;
- _showData(data, SHELL_DATA_SIZE);
- printf("Swap time: %d\n", bm.swapTime);
- printf("Verify time: %d\n", bm.verifyTime);
- }
- }
沒有留言:
張貼留言