插入排序

来源:互联网 发布:摄像头自动对焦算法 编辑:程序博客网 时间:2024/04/27 16:20

有两种简单排序算法分别是插入排序和选择排序,两个都是数据量小时效率高。实际中插入排序一般快于选择排序,由于更少的比较和在有差不多有序的集合表现更好的性能。但是选择排序用到更少的写操作,所以当写操作是一个限制因素时它被使用到。

常常被用作为复杂算法的一部分,希尔排序是插入排序的一种变体对数据大时更有效。

优点:

1.实现简单;

2.对于少量数据效率高;

3.对于差不多已经排好顺序的集合效率高,时间复杂度为O(n+d),d是错位数字的个数;

43比起其他简单二次(O(n^2))算法(选择排序,冒泡排序),他的最好的情况是O(n)(集合接近顺序排好);

5.稳定,不会改变相等数原有的顺序;

插入排序类似于选择排序,不同之处是插入排序是一个元素一个元素地往有序序列中插入,而选择排序则是在无序序列中选择最大(最小)元素放入有序队列末尾。一个主要操作有序队列,一个则是无序队列。这样就导致选择排序每次都要遍历一次无序队列,而插入排序则不需要遍历整个有序队列,只需要遍历到该元素应有的位置即可,这样就使得基本有序的队列的复杂度为O(n).

但同时这会导致插入排序用到更多的写操作,因为内部循环时他对数组进行大量的移位操作,大家知道移位操作对于数组是非常低效率的。而选择排序因为每次添加元素都是添加在末尾,所以不需要移位操作。

#include <stdio.h>

void insertSort(int arr[], int size)
{
    int pos1 = 0, pos2 =0;
    for(pos1 = 1; pos1 < size; ++pos1)
    {
        int temp = arr[pos1];
        for(pos2 = pos1-1; pos2 >= 0; --pos2)
        {
            if( arr[pos2] > temp)
            {
                arr[pos2+1] = arr[pos2];
            }
            else
            {
                break;
            }
        }
        arr[pos2+1] = temp;
    }
}

int main()
{
    int arr[] = {-3,-5,0,-2,5,1,6,8,7,-9,20};
    int i = 0;
    insertSort(arr, 11);
    

    for(i = 0; i < 11; ++i)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");

    return 0;

}

 

0 0