美文网首页数据结构
排序 --- 插入排序

排序 --- 插入排序

作者: 挽弓如月_80dc | 来源:发表于2019-07-31 16:53 被阅读0次

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

算法步骤

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

相关文章

  • 算法-插入排序

    算 法:插入排序算法时间复杂度: 插入排序算法描述 插入排序伪代码 插入排序实现 插入排序算法概述 插入排...

  • c算法O(n)^2(一)

    选择排序 插入排序 优化插入排序算法

  • java快速学习排序---插入排序

    1.java实现插入排序 (1)、图解插入排序 (2)、插入排序的思想 (3)、插入排序的代码实现

  • 算法(排序)

    一、内部排序 1、插入排序—直接插入排序(Straight Insertion Sort) 2、插入排序—希尔排序...

  • Java排序算法

    插入排序 直接插入排序 折半插入排序 交换排序 冒泡排序 快速排序 选择排序 简单选择排序 堆排序 其他排序 二路...

  • 一遍文章搞定插入排序-java版

    插入排序 1.1 插入排序的基本介绍 插入排序属于内排,就是以插入的方式来达到排序的目的 1.2 插入排序思想 将...

  • 排序(新排版)

    冒泡排序 插入排序 二分插入排序 希尔排序 选择排序 快速排序

  • iOS算法

    排序方法 选择排序:直接选择排序、堆排序。 交换排序:冒泡排序、快速排序。 插入排序:直接插入排序、二分法插入排序...

  • Java学习记录(常用 算法 排序 )

    排序算法的分类如下: 1.插入排序(直接插入排序、折半插入排序、希尔排序);2.交换排序(冒泡泡排序、快速排序);...

  • 排序——插入排序

    业精于勤荒于嬉 插入排序包括:直接插入排序、折半插入排序、希尔排序(缩小增量排序) 一、直接插入排序 1. 算法思...

网友评论

    本文标题:排序 --- 插入排序

    本文链接:https://www.haomeiwen.com/subject/nmutdctx.html