一、直接插入排序
直接插入排序的基本思想是:將一個記錄插入到已排好序的有序表中,從而得到一個新的有序表。
設數組爲a[0…n-1]。
1. 初始時,a[0]自成1個有序區,無序區爲a[1..n-1]。令i=1
2. 將a[i]併入當前的有序區a[0…i-1]中形成a[0…i]的有序區間。
3. i++並重復第二步直到i==n-1。排序完成。
java實現
public void insertSort(int array[]) {
int i,j;
for(i=1;i<array.length;i++) {
//a[i]>a[i-1]表示a[0..i]是有序的,無需調整
//否則令j=i-1,temp=a[i]。然後一邊將數據a[j]向後移動一邊向前搜索,當有數據a[j]<a[i]時停止並將temp放到a[j + 1]處。
if(array[i]<array[i-1]) {
int temp=array[i];
for(j=i-1;j>=0&&array[j]>temp;j--) {
array[j+1]=array[j];
}
array[j+1]=temp;
}
}
//再對將a[j]插入到前面a[0…j-1]的有序區間所用的方法進行改寫,用數據交換代替數據後移。
//如果a[j]前一個數據a[j-1] > a[j],就交換a[j]和a[j-1],再j--直到a[j-1] <= a[j]。
public static void insertSort2(int array[]) {
int i,j;
for(i=1;i<array.length;i++) {
for(j=i-1;j>=0&&array[j+1]<array[j];j--) {
int temp=array[j+1];
array[j+1]=array[j];
array[j]=temp;
}
}
}
複雜度分析:
對於n個記錄的文件,要進行n-1趟排序。
各種狀態下時間複雜度爲:
空間複雜度爲o(1)
是穩定的排序算法。