插入排序

2018-10-24  本文已影响0人  卡布萨岛

从整个待排序列中选出一个元素插入到已经有序的子序列中去,得到一个有序的、元素加一的子序列,直到整个序列的待插入元素为0,则整个序列全部有序。

在实际的算法中,我们经常选择序列的第一个元素作为有序序列(因为一个元素肯定是有序的),我们逐渐将后面的元素插入到前面的有序序列中,直到整个序列有序。

代码

#include<stdio.h>
#include<stdlib.h>
void InsertionSort(int *a,int n);
void main()
{
    int a[] = {2,4,6,8,0,1,5,9,7,3};
    int i;
    InsertionSort(a,10);
    for(i = 0;i<10;i++)
    {
      printf("%d ",a[i]);
    }
    printf("\n");
    system("pause");
}

void InsertionSort(int *a,int n)//插入比前一个大的比后一个小的 ,n为传入的数组元素个数
{
  int temp;
  int in,out;
  for(out = 1;out<n;out++)    //out为传出将要插入的数组标号(从1开始)
  {
      temp = a[out];    //先把传出的元素赋值给temp
      in = out;         //in为传人将要插入的数组标号
      while(in>0 && a[in-1]>=temp)  //当传入的数组标号大于0并且前一个大于
      {                              //temp的值时
            a[in] = a[in-1];//当传入插入的前一个元素大于temp时,将元素后移
            in--;
      } //直到传入插入的前一个元素小于temp时退出循环
        a[in] = temp;  //当传入插入的前一个元素小于temp时,最后一次循环将元素后移,in--,将插入的元素传入in
  }
}

运行结果:

Front
2 4 6 8 0 1 5 9 7 3
Back
0 1 2 3 4 5 6 7 8 9

时间复杂度

平均来说插入排序算法的时间复杂度为O(n^2)

总结:

如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)

上一篇 下一篇

猜你喜欢

热点阅读