一、首先說一下插入排序的整體思路
通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。
數組分爲兩部分:有序部分和無序部分。取出無序部分的第一個元素,與有序區部分進行比較,並插入到合適的位置。
二、詳細圖解
通過下圖來了解一下整個排序過程吧,現在排序一個亂序數組,如下
1、首選取出第一個元素 10,認爲10已經是有序的了,進行下一步
2、取出元素7,與10進行比較,比10小,交換10和7的位置,進行下一步
3、取出元素6,與10進行比較,比10小,交換位置,然後和7進行比較,比7小交換位置,進行下一步
4、取出元素8,與10比較,比10小,交換位置,與7比較,比7大,不動,進行下一步
………………………………………………………….
一直順序重複操作,完成排序
三、代碼實現
public void sort(int[] arr)
{
int length = arr.length;
for(int i=0;i<length-1;i++)
{
if(arr[i]>arr[i+1])
{
for(int j=i;j>=0&&arr[j]>arr[j+1];j--)
{
int tmp = arr[j];
arr[j]=arr[j+1];
arr[j+1] = tmp;
}
}
}
}
四、時間和空間複雜度
1、時間複雜度
最好情況
是有序數組,比較次數是n-1,不需要移動
最壞情況
需要進行n-1次排序,比較次數(n+2)(n-1)/2
移動次數(n+4)(n-1)/2
平均比較次數 (n+2)(n-1)/4,移動次數(n+6)(n-1)/6
所以時間複雜度是O(n2)
2、空間複雜度
整個過程只有一個tmp變量,所以空間複雜度是O(1)