排序算法之直接插入排序

本文介绍了直接插入排序的基本思想,并提供了一个C++实现示例。通过遍历待排序序列,将每个元素插入到已排序部分的正确位置,从而逐步构建有序序列。
摘要由CSDN通过智能技术生成
A,直接插入排序:排序过程中,整个序列被分成两部分,前一部分有序,后一部分无序。每次从无序表中取出一个元素,然后把它插入到有序表中的合适位置,使有序表保持有序,直到无需表部分元素个数为0,排序结束。
B,算法原理:
1)假设数组序列依次为a1,a2,.....,an;
2)第一趟比较a1和a2,时前两个元素升序排序,第二趟比较a1,a2,a3,使前三个元素升序排序;
3)每次新元素i插入到前i-1个已经有序的元素中时,依次与i-1,i-2,...,1位置的元素比较,并插入到对应次序位置;
4)以此类推,直到使前n个元素有序,排序结束。
下图为一组乱序序列直接插入排序的过程:
排序算法之直接插入排序

C,算法实现:
#include ”iostream”

usingnamespace std;

 

intmain()

{

        void sort(int[], int);

        int array[] = {5,3,11,7,1,8,12,14,9};

        int n = sizeof(array)/sizeof(int*);

        sort(array, n);

        for(int i = 0; i < n; ++i)

                  cout<<array[i]<<" ";

        cout<<endl;

        return 0;

}

//直接插入排序

//array表示测试元素序列,n为序列元素个数

voidsort(int array[], int n)

{

        int temp,index;

        for(int i = 1; i < n; ++i)

        {

                  temp = array[i];

                  index = i;

                  //找到元素插入的位置

                  for(int j = i - 1; j >= 0; --j)

                  {

                           if(array[index] < array[j])

                                    index = j;

                           else break;

                  }

                  //将插入位置之后的元素后移一个位置

                  for(int k = i; k > index; --k)

                           array[k] = array[k-1];

                  array[index] = temp;

        }

}

运行结果:

排序算法之直接插入排序
D,复杂度分析
(a)时间复杂度:
    1)如果序列初始为升序排序,则无需移动,只需比较n-1次即可完成排序,因此最好的时移动次数复杂度 
        为O(n),移动次数复杂度为O(1);
    2)如果序列初始为降序排序,则最坏需要比较1+2+3+...+(n-1)=n(n-1)/2次,最坏需要移动1+2+...+        (n-1)=n(n-1)/2次,因此比较的最坏时间复杂度为O(n^2),移动的最坏时间复杂度为O(n^2);
    3)综上所述,比较的平均时间复杂度为O(n^2),移动的平均时间复杂度为O(n^2)。
(b)空间复杂度:程序中定义了temp和index两个变量,因此空间复杂度为O(1)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值