基本思想:取序列中的第i個元素,(在取到第i個元素之前,第i個元素前面的序列已經經過排序,成爲有序序列,第i個元素及其之後的序列即爲無序序列),將第i個元素與之前的有序序列中的元素依次進行比較,並將其插入到合適的位置,由此對原序列中的每一個元素進行上述操作,即可得到有序序列
因爲在獲取待插入元素的時候要對數組進行一次遍歷,而每遍歷到一個元素又要將其與之前的有序序列中的元素進行比較,又要進行一次遍歷,因此最差的時間複雜度爲O(N^2),即當整個數組剛好與所要求的排序序列順序相反;與之對應的則是最優時間複雜度爲O(N),即整個數組的序列與所要求的順序序列一致,相當於只進行一次遍歷
空間複雜度爲O(1),且算法穩定性穩定(即原序列中的兩個相等元素的先後次序在排序前後並不會發生改變)
而對於上面的直接插入排序算法屬於邊比較,邊搬移元素,比較簡單,很容易想通,但是效率也比較低,而最容易想到的優化方案,就是先找插入位置,在進行元素的搬移,這樣一來,在找插入元素的時候由於是有序序列,可以採用二分查找來進行相應的優化
代碼如下:
int BinarySearch(int arr[],int size,int data)
{
int left=0;
int right=size;
while(left<right)
{
int mid=(left&right)+((left^right)>>1);
if(arr[mid]>data)
right=mid;
else
left=mid+1;
}
return left;
}
void InsertSort(int arr[],int size)
{
assert(arr);
int i=1;
for(;i<size;i++)
{
int pos=BinarySearch(arr,i,arr[i]);
int data=arr[i];
int end=i;
while(end>pos)
{
arr[end]=arr[end-1];
end--;
}
arr[pos]=data;
}
}
這樣一來,時間複雜度可以爲O(NlogN)
對於插入排序而言,無論有沒有加入二分查找進行優化,它都是比較適用於數據量小,而且序列接近所要的順序的數據序列