Shell(希爾)排序
阿新 • • 發佈:2018-11-21
shell排序演算法描述:
我們簡單處理增量序列:增量序列d = {n/2 ,n/4, n/8 …..1} n為要排序數的個數 ,即:先將要排序的一組記錄按某個增量d(n/2,n為要排序數的個數)分成若干組子序列,每組中記錄的下標相差d。對每組中全部元素進行直接插入排序,然後再用一個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。繼續不斷縮小增量直至為1,最後使用直接插入排序完成排序。
Shell排序示例如下:
程式碼實現如下:
#include<stdio.h> void ShellSort(int arr[],int n){ int step=n/2; //取增量 while(step>=1){ for(int i=step;i<n;i++){ int temp=arr[i]; //從這一行開始就是直接插入排序 int j; for(j=i-step;j>-1&&temp<arr[j];j-=step){ arr[j+step]=arr[j]; } arr[j+step]=temp; //直接插入排序到這裡結束,其實把step換成1就是直接插入排序了。 } step=step/2; //每一次把增量除以2 } } int main(void) { int a[8]={4,2,5,8,3,7,6,9}; ShellSort(a,8); for(int i=0;i<8;i++) printf("%4d",a[i]); }
Shell排序的時間效能優於直接插入排序:
希爾排序的時間效能優於直接插入排序的原因:
①當檔案初態基本有序時直接插入排序所需的比較和移動次數均較少。
②當n值較小時,n和n^2的差別也較小,即直接插入排序的最好時間複雜度O(n)和最壞時間複雜度0(n^2)差別不大。
③在希爾排序開始時增量較大,分組較多,每組的記錄數目少,故各組內直接插入較快,後來增量di逐漸縮小,分組數逐漸減少,而各組的記錄數目逐漸增多,但由於已經按di-1作為距離排過序,使檔案較接近於有序狀態,所以新的一趟排序過程也較快。
因此,希爾排序在效率上較直接插入排序有較大的改進。
總結:Shell排序時間複雜度:在最優的情況下,時間複雜度為:O(n ^ (1.3) ) (元素已經排序好順序)
在最差的情況下,時間複雜度為:O(n ^ 2)。它是一種不穩定的插入排序。