采用的是以“玩橋牌者”的方法為基礎的。即在考察記錄Ri之前,設以前的所有記錄R1, R2,…., Ri-1已排好序,然後將Ri插入到已排好序的諸記錄的適當位置。
最基本的插入排序是直接插入排序(Straight Insertion Sort)。
1.1 排序思想
將待排序的記錄Ri,插入到已排好序的記錄表R1, R2,…., Ri-1中,得到一個新的、記錄數增加1的有序表。直到所有的記錄都插入完為止。
設待排序的記錄順序存放在數組R[1…n]中,在排序的某一時刻,將記錄序列分成兩部分:
◆R[1…i-1]:已排好序的有序部分;
◆R[i…n]:未排好序的無序部分。
顯然,在剛開始排序時,R[1]是已經排好序的。
1.3 實現代碼:
#include#include #define SIZE 10 void InsertionSort(int *a,int len) { int i,j,t,h; for (i=0; i =0 && t
運行結果:
2. 希爾排序
<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgICAgICDPo7b7xcXQ8ihTaGVsbCBTb3J0o6zT1rPGy/XQodT2wb+3qCnKx9K71ta31tfpsuXI68XF0PK3vbeooaM8L3A+CjxwPjIuMSDFxdDyy7zP6zwvcD4KPHA+PGJyPgo8L3A+CjxwPiAgICAgICAgotkgIM/IyKHSu7j21f3V+8r9ZDEoZDE8binX986qtdrSu7j21PbBv6OsvavIq7K/brj2vMfCvLfWs8lkMdfpo6yw0cv509DP4Lj0ZDG1xLzHwry3xdTa0rvX6dbQo6y8tLbU09rDv7j2ayhrPTEsMiwgIKGtZDEpo6xSW2tdLFJbZDEmIzQzO2tdLFJbMmQxJiM0MztrXSAsoa231tTazazSu9fp1tCjrNTauPfX6cTavfjQ0NaxvdOy5cjrxcXQ8qGj1eLR+dK7tM631tfpus3FxdDyuf2zzLPGzqrSu8zLz6O2+8XF0PKjuzwvcD4KPHA+ICAgICAgICCi2iAgyKHQwrXE1PbBv2QyPGQxo6zW2Li0otm1xLfW1+m6zcXF0PKy2df3o7vWsdbBy/nIobXE1PbBv2RpPTHOqta5o6y8tMv509C8x8K8t8W9+NK7uPbX6dbQxcXQ8s6q1rmhozwvcD4KPGJyPgoyLjIgvtnA/Qo8cD48YnI+CjwvcD4KPHA+PGltZyBzcmM9"http://www.Bkjia.com/uploadfile/Collfiles/20140105/20140105094550149.jpg" alt="\">
2.3 實現代碼:
#include#include #define SIZE 10 void ShellSort(int *a,int len) { int i,j,h; int r,temp; int x = 0; for (r = len/2; r>=1; r/=2) { for (i = r; i =0 && temp < a[j]) { a[j+r] = a[j]; j-=r; } a[j+r] = temp; } x++; printf("第%d步行排序結果:",x); for (h = 0; h < len; h++) { printf(" %d",a[h]); } printf("\n"); } } int main(int argc, const char * argv[]) { int shuzu[SIZE],i; srand(time(NULL)); for (i=0; i
運行結果:
參考書籍:《C/C++常用算法手冊》 《數據結構-清華大學嚴蔚敏》