這裡總結一下三種插入排序的演算法:
直接插入排序是一種最簡單的排序方法,它的基本操作就是將乙個記錄插入到已排好序的有序表中,從而得到乙個新的、記錄數增1的有序表。
為了在查詢插入位置的過程中避免陣列下標出界,在r[0]處設定監視哨。
舉例:
有一串行為:
i=1: (5) 4 6 8 7 2 3
i=2: (4 5) 6 8 7 2 3
i=3: (4 5 6) 8 7 2 3
i=4: (4 5 6 8) 7 2 3
i=5: (4 5 6 7 8) 2 3
i=6: (2 4 5 6 7 8) 3
i=7: (2 3 4 5 6 7 8)
實現**如下:
/*
insertsort implementation
author:zzj
date:17-6-17
*/#include
using
namespace
std;
const
int maxn = 100;
int a[maxn];
int n;
void insertsort(int *a)
}} int main()
insertsort(a);
for(int i=1; i<=n; i++)
return
0;}
這裡再提供一種減小了比較次數的插入排序演算法——折半插入排序,正是利用了插入到有序子表這一特點,有序就可以用二分。
就是找到要插入的位置是通過二分法來查詢,這樣會減少次數。
/*
binsertsort implementation
author:zzj
date:17-6-17
*/#include
using
namespace
std;
const
int maxn = 100;
int a[maxn];
int n;
void binsertsort(int *a)
for(int j=i-1; j>=high+1; j--) a[j+1] = a[j];//記錄後移
a[high+1] = a[0]; //插入
}}int main()
binsertsort(a);
for(int i=1; i<=n; i++)
return
0;}
最後再介紹一下這個排序方法。
基本思想是:先將整個待排記錄序列分割成若干子串行分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行一次直接插入排序。
舉例:
有一串行為:
初始態: 5 4 6 8 7 2 3 增量先是5
第一趟: 2 3 6 8 7 5 4 增量變為3
第二趟: 2 3 5 4 7 6 8 增量變為1
第三趟: 2 3 4 5 6 7 8
/*
shellsort implementation
author:zzj
date:17-6-17
*/#include
using
namespace
std;
const
int maxn = 100;
int a[maxn];
int n;
/* 希爾插入排序與直接插入相比,修改了:
1.前後記錄位置的增量為dk,而不是1
2.a[0]只是暫存單元,不是哨兵
*/void shellinsert(int *a, int dk)
}}/*希爾排序*/
void shellsort(int *a, int *dlta, int t)
}int main()
int dt[3] = ;
shellsort(a, dt, 3);
for(int i=1; i<=n; i++)
return
0;}
插入排序 折半插入排序
折半插入排序 binary insertion sort 直接插入排序採用順序查詢法查詢當前記錄在已排好序的序列中插入位置,這個 查詢 操作可利用 折半查詢 來實 現,由此進行的插入排序稱之為折半插入排序 binary insertion sort 演算法思想 1 將待排序的記錄存放在陣列r 1.n...
插入排序 折半插入排序
折半插入排序是基於直接插入排序的優化。直接插入排序 將第i個元素插入時,通過折半查詢的方式,來查詢第i個元素合適的位置。當0 i 1 位置上的元素都已經排序ok,現需要插入第i個元素,設其值為temp 令low 0,high i,mid high low 2。那麼temp可能插入的位置是 low h...
插入排序 希爾插入排序
本文借鑑於lsgo實驗室創始人馬老師 演算法 希爾插入排序 delta len nums 2 while delta 0 shell delta,nums delta delta 2return nums defshell delta,key for i in range delta,len key...