插入排序:將待排序元素分為已排序子集和未排序子集,一次從未排序子集中的乙個元素插入已排序子集中,使已排序自己仍然有序;重複執行以上過程,指導所有元素都有序為止。
希爾排序又稱為縮小增量排序,它也是一種屬插入排序類的方法,但在事件效率上較前述集中排序方法都有較大的改進。
從對直接插入排序的分析得知,其演算法時間複雜度為o(
n2) ,但是若待排記錄序列為「正序」時,其時間複雜度可提高至o(
n)。由此可設想,若待排記錄序列按關鍵字基本有序,即序列中具有下列特性l.
data
[i].key
x1≤j
的記錄較少時,直接插入排序的效率就可大大提高,從另一方面來看,由於直接插入排序的演算法簡單,則在n值很小時效率也比較高。希爾排序正是從這兩點分析出發對直接插入排序進行改進得到的一種排序方法。
基本演算法思想:先將整個待排記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄基本有序時,再對全體記錄進行一次直接插入排序。
從上述排序過程可見,希爾排序的乙個特點是:子串行的構成不是簡單地逐段分割,而是將相隔某個增量的記錄組成乙個子串行。如上圖中,第一趟排序時的增量為5,第二趟排序時的增量為3,由於在前兩趟的插入排序中記錄的關鍵字是和同一子串行中的前乙個記錄的關鍵字進行比較,因此關鍵字較小的記錄就不是一步一步地往前挪動,而是跳躍式地往前移,從而使得在進行最後一趟增量為1的插入排序時,序列已基本有序,只要作記錄的少量比較和移動即可完成排序,因此希爾排序的時間複雜度較直接插入排序低。
#include
#include
#define maxsize 100
typedef
int keytype;
typedef
struct
/*資料元素型別定義*/
datatype;
typedef
struct
/*順序表型別定義*/
sqlist;
void
shellinsert(sqlist *l,int c)
/*對順序表l進行一次希爾排序,c是增量*/
}}void
shellinsertsort(sqlist *l,int delta,int m)
/*希爾排序,每次呼叫演算法shellinsert,delta是存放增量的陣列*/
}
void initseqlist(sqlist *l,datatype a,int n)
/*順序表的初始化*/
l->length=n;
}void displist(sqlist l,int n)
/*順序表的輸出*/
void main()
; int delta=;
int n=10,m=3;
sqlist l;
initseqlist(&l,a,n);
printf("[排序前] ");
displist(l,n);
shellinsertsort(&l,delta,m);
printf("[希爾排序結果] ");
displist(l,n);
}
希爾排序學習筆記
希爾排序時對插入排序的優化,當較小元素在靠後位置時,將會發生大量的移位,效率比較低下,而希爾排序通過分組使得後面的元素移到前面只需要很少的移位就可以完成,隨著分組的的容量逐漸減少,等到分組容量為1的時候排序基本完成了,再使用插入排序就只涉及很少的移位了 思路 一開始另分組容量為length 2,每次...
學習筆記 希爾排序
將乙個一維陣列從小到大排序。希爾排序是插入排序的優化方式,因為普通的插入排序會存在乙個問題,那就是當比較小的數字排在後面時,需要後移很多次才能完成。由此,希爾排序的思路是 引入乙個步長的因素gep。之前的冒泡也好選擇也好插入也好,都是之間跟之前或之後的一個數字進行比較,然後再 或 而希爾排序簡單來說...
演算法筆記 希爾排序
希爾排序是直接插入排序 的改進版,對於待排序序列的不同情況效率相近。1.演算法思想 先選取乙個小於n的增量d1,把序列中所有元素分成n d1個組,所有距離為d1的倍數的元素在同一組中,在各組內執行直接插入排序。然後選取乙個更小的增量d2,重複上述分組和排序過程 繼續減小增量,直至增量為1,即所有元素...