直接插入排序算法总结(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(参考:代码实现、原理讲解)

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