轉載請註明出處:http://blog.csdn.net/ljmingcom304/article/details/50370127
本文出自:【梁敬明的博客】
1.直接插入排序
直接插入排序就是將序列中第一個元素作爲新的有序序列,然後從第二個元素開始將其插入有序序列的合適位置,以此類推將前n-1個元素作爲新的有序序列,從第n個元素開始將其插入有序序列的合適位置,直到完成序列的排序。
存在一個序列【7】【5】【9】【6】【8】,將其按照從小到大的順序進行排序。
第一次排序,將元素【5】作爲有序序列,元素【5】比元素【7】小,則將元素【5】插入到元素【5】前。
第二次排序,將元素【5】【7】作爲有序序列,元素【9】比前兩個元素都大,位置不變。
第三次排序,將元素【5】【7】【9】作爲有序序列,元素【6】比元素【5】大,比元素【7】小,將元素【6】插入到元素【5】和元素【7】之間。
第四次排序,將元素【5】【6】【7】【9】作爲有序序列,元素【8】比元素【7】大,比元素【9】小,將元素【8】插入到元素【7】和元素【9】之間。
2.示例代碼
對一個長度爲N的序列從小到大進行排序,選取前N-1個元素作爲有序序列,將第N個元素插入前N-1個元素中的合適位置作爲新的有序序列。
public class InsertSort {
public static void main(String[] args) {
int[] array = { 4, 7, 8, 6, 5, 9, 3, 0, 2, 3 };
InsertSort.sort(array);
System.out.println("排序後數組:" + Arrays.toString(array));
}
public static void sort(int[] a) {
// 第一個數是有序的,從第二個數開始遍歷,依次插入有序序列
for (int i = 1; i < a.length; i++) {
int j = 0;
int temp = a[i];// 取出第i個數,和第i-1個數進行比較,插入合適位置
if (temp >= a[i - 1])// 第i個數比有序序列的最後一個數大,則進行下一次循環
continue;
for (j = i - 1; j >= 0 && temp < a[j]; j--) {
// 將比temp大的元素後移
a[j + 1] = a[j];
}
a[j + 1] = temp;
}
}
}
3.算法分析
時間複雜度:
當序列爲正序時,比較次數爲
當序列爲逆序時,比較次數爲
直接插入排序的平均時間複雜度爲
算法穩定性:
直接插入排序中相同元素的前後位置不會發生改變,是一種穩定的排序算法。