数据结构

排序 --- 插入排序

2019-07-31  本文已影响0人  挽弓如月_80dc

插入排序是一种简单直观且稳定的排序算法。
基本操作是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。

算法步骤

1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
图解算法.gif

算法实现

C

/*
 * 直接插入排序
 *
 * 参数说明:
 *     a -- 待排序的数组
 *     n -- 数组的长度
 */
void insert_sort(int a[], int n)
{
    int i, j, k;
    for (i = 1; i < n; i++)
    {
        //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
        for (j = i - 1; j >= 0; j--)
            if (a[j] < a[i])
                break;

        //如找到了一个合适的位置
        if (j != i - 1)
        {
            //在已经排序数列中,将比a[i]大的数据向后移;
           //因为在后移过程中会覆盖a[i],所以用临时变量保存
            int temp = a[i];
            for (k = i - 1; k > j; k--)
                a[k + 1] = a[k];
            //将a[i]放到正确位置上
            a[k + 1] = temp;
        }
    }
}


// 数组长度
#define LENGTH(array) ( (sizeof(array)) / (sizeof(array[0])) )

void main()  {
    int i;
    int a[] = {20,40,30,10,60,50};
    int ilen = LENGTH(a);
 
    printf("before sort:");
    for (i=0; i<ilen; i++) {
         printf("%d ", a[i]);
    }
    printf("\n");
 
    insert_sort(a, ilen);
 
    printf("after  sort:");
    for (i=0; i<ilen; i++) {
         printf("%d ", a[i]);
    }
    printf("\n");
 }

OC实现

 
    NSMutableArray *arr = [NSMutableArray arrayWithArray:@[@"5",@"7",@"1",@"4",@"5"]];
    NSLog(@"排序前:%@",arr);
    
    int i, j;
    NSString *temp;
    for (i = 1; i < arr.count; i++) {
        temp = arr[i];
        j = i-1;
  
    #比较与移动同时进行
        while (j>-1 && [temp integerValue] < [arr[j] integerValue]) {
            arr[j+1] = arr[j];
            j--;
        }
        
        arr[j+1] = temp;
    }
    
    NSLog(@"排序后:%@",arr);

排序前:(
    5,
    7,
    1,
    4,
    5
)

排序后:(
    1,
    4,
    5,
    5,
    7
)

时间复杂度

假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢?N-1!因此,直接插入排序的时间复杂度是O(n²)。

稳定性

比较稳定的算法

参考文章1
参考文章2

上一篇 下一篇

猜你喜欢

热点阅读