直接插入排序算法總結(C++代碼、Qt)

直接插入算法是一種穩定的(排序前後相同元素相對位置保持不變)排序算法,空間複雜度是O(1),最壞時間複雜度是O(n^{2})。一般用在數組基本有序或者數據規模很小的時候非常高效。直接插入排序主要思想是將一個數組分爲有序數組和無序數組,然後將無序數組依次插入有序數組中,插入的時候,從無序數組的左邊第一個數開始,往有序數組的右邊第一個數從右到左插入;當待插入數據小於插入數據時,則該有序數組該位起的右邊所有數據,依次向右移動一位,直到有序數組中有一個數大於待排數,則待排數插入該位置。

下圖是引用這位作者的圖片: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(參考:代碼實現、原理講解)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章