排序之希爾排序(Shell Sort)
阿新 • • 發佈:2018-12-24
希爾排序(Shell Sort):又叫縮小增量排序,該方法是直接插入排序的改進,其實質就是分組直接插入排序;
我們還記得直接插入排序對基本有序的序列排序時,效率很高;由此思想得出希爾排序;
基本思想:
先將待排序序列分成若干個子序列(由相距同等增量的元素組成),然後分別對分組序列進行直接插入排序;
縮小增量,依據增量再次分組排序。待到整個序列基本有序時,整體進行直接插入排序;
演算法操作步驟:
1)選擇某一增量序列:gap1 , gap2......gapk,其中gapi > gapj,gapk = 1;
2)按照給定增量序列個數K,需要進行K趟排序;
3)每趟排序中,根據給定增量gapi,將序列分成程度為m的不同子序列,對子序列進行直接插入排序;
演算法實現:
#include<iostream> using namespace std; //-------------------------------------------------------希爾排序 -------------------------------------------------------------------------- void ShellSort_Soulation1(int* data , int dLength) { if(data == NULL ||dLength <= 0) return; int i , j , gap; //gap 步長 for(gap = dLength / 2; gap > 0; gap /= 2) for(i = 0; i < gap; i++) { //小組插入排序 for(j = i + gap; j < dLength; j += gap) { if(data[j] < data[j - gap]) { int temp = data[j]; int k = j - gap; while(k >=0 && data[k] > temp) { data[k + gap] = data[k]; k -= gap; } data[k + gap] = temp; } } } } void ShellSort_Soulation2(int* data , int dLength) { if(data == NULL || dLength <= 0) return; int i , j , gap; for(gap = dLength / 2; gap > 0; gap /= 2) for(i = gap; i < dLength; i++) for(j = i - gap; j >= 0 && data[j] > data[j + gap]; j -= gap) //資料交換代替資料依次後移,會簡潔些; swap(data[j] , data[j + gap]); }