直接插入排序法
插入排序的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,在從後向前掃描過程中,需要反覆把已排序元素逐步向後移動,為最新元素提供插入空間。
核心程式碼:
//直接插入排序法 void InsertSort(int a[],int n){ int i,j,k,t; for(i = 1 ; i<n;i++){ k = a[i]; /* 第一次比較粗糙的寫法 j = i-1; while(j >= 0 && a[j] > t){ a[j+1] = a[j]; j--; }*/ for(j=i-1;j>0 && a[j] >t;--j) a[j+1] = a[j]; a[j+1] = k; } }
希爾排序法
希爾排序又稱為縮小增量排序,也屬於插入排序類的演算法,是對直接插入排序的一種改進。
基本思想就是:將需要排序的序列劃分為若干個較小的序列,對這些序列進行直接插入排序,通過這樣的操作可使用需要排序的數列基本有序,最後再使用一次直接插入排序。這樣,首先對數量較小的序列進行直接插入排序可提高效率,最後對基本有序的序列進行直接插入排序,也可提高效率,從而使整個排序過程的效率得到提升。
剛看一遍希爾排序後,基本理解,但是理解的有偏差,應該是根據增量將陣列分成若干個序列,對這些序列進行直接插入排序,但是我理解的是根據增量對每對元素進行比較大小並交換。
上圖中,當增量為2時,其實是分成兩個序列,然後對這兩個序列進行直接插入排序,而並非只是將下標為0和2、1和3...的進行比較交換。
上程式碼:
//希爾排序 void ShellSort(int a[],int n){ int i,j,t,d; d = n/2; //計算第一次分量:總元素數量的一半 while(d>=1){ for(i=d;i<n;i++){ //以增量構成序列,進行直接插入排序 /* 第一次理解有誤程式碼,可能測試資料碰巧,對有的陣列排序正常 j = i+d; if(j >= n) break; if(a[i]>a[j]){ t = a[i]; a[i] = a[j]; a[j] = t; }*/ t = a[i]; //獲取序列中最後一個資料 j=i-d; //獲取序列中上一個序列號 //以d為增量,進行直接插入排序 while(j>=0 && a[j]>t){ a[j+d] = a[j]; j-=d; } a[j+d] = t; } d/=2; //增量減半 } }