直接插入算法是一種穩定的(排序前後相同元素相對位置保持不變)排序算法,空間複雜度是,最壞時間複雜度是。一般用在數組基本有序或者數據規模很小的時候非常高效。直接插入排序主要思想是將一個數組分爲有序數組和無序數組,然後將無序數組依次插入有序數組中,插入的時候,從無序數組的左邊第一個數開始,往有序數組的右邊第一個數從右到左插入;當待插入數據小於插入數據時,則該有序數組該位起的右邊所有數據,依次向右移動一位,直到有序數組中有一個數大於待排數,則待排數插入該位置。
下圖是引用這位作者的圖片:https://mp.weixin.qq.com/s/vn3KiV-ez79FmbZ36SX9lg
一、實現步驟詳解
實現步驟主要如下
1.1對數組arr[]進行劃分。選取左邊第一位數作爲有序數組,右邊size-1個數爲無序數組;
int tmp=arr[i];
int orderNum=i-1;//有序數下標
1.2對無序數組進行遍歷,選取左邊第一個待排序數進行插入;
for(int i=1;i<size;i++){}
1.3在有序數組中找到待排序數的插入位置。方法之一可以通過一個while循環,循環終止條件爲當待排序數小於有序數組右邊第一位時,則有序數組該位起依次右移一位,也即是將orderNum位賦值給orderNum+1位,然後orderNum--,依次循環移動,直到找到要插入的位置(即大於有序數組前面的一位,小於有序數組後面的一位數)
while ((orderNum>=0)&&(tmp<arr[orderNum]))
{
arr[orderNum+1]=arr[orderNum];
orderNum--;
}
1.4跳出循環,將待排序數插入該位置。
arr[orderNum+1]=tmp;
二、完整代碼示例
2.1完整代碼算法如下
void insertSort(int arr[], int size)
{
for(int i=1;i<size;i++)//對左邊開始第二個到最後的待排數組進行遍歷
{
//第二個數開始,跟有序數組從右到左進行比較;如果小於有序數組,則有序數組該數據起,依次往右移動一位;大於則不移動
int tmp=arr[i];
int orderNum=i-1;//有序數下標
//循環目的:找到數組的下標,將一位待排數據插入該位置
while ((orderNum>=0)&&(tmp<arr[orderNum])) //從右到左,跟右邊第一個有序數比較,如果小於,則有序數組該比較位開始到最後一個,整體右移一位
{
arr[orderNum+1]=arr[orderNum];//因爲orderNum+1位數始終是待存儲位,始終是空出來的;通過循環進行移位
orderNum--;
}
arr[orderNum+1]=tmp;//找到了數組待插入的下標位置,插入待排數據
}
}
2.2調用實例如下
void Widget::on_pushButton_clicked()
{
//基本插入排序
int arr[] = {79,66,43,83,30,87,38,55,91,72,49,9};
insertSort(arr,12);//基本插入排序
QString array,tmp;
for(quint32 i=0;i<12;i++)
array.append(tmp.sprintf("%d ",arr[i]));
qDebug()<<array;
}
2.3輸出結果如下
參考內容:
https://mp.weixin.qq.com/s/vn3KiV-ez79FmbZ36SX9lg(參考:動態圖)
https://blog.csdn.net/LoveHYZH/article/details/86748132#3__11(參考:代碼實現、原理講解)