排序算法之直接插入排序

来源:互联网 发布:什么是微观数据 编辑:程序博客网 时间:2024/05/22 04:56
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)。
0 0
原创粉丝点击