• 数据结构-插入排序


    1、插入排序

    它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

    我们预留了一个哨兵,这里我们将用到它来保存一个临时值。插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。

    插入排序的算法步骤如下:

    1. 从第一个元素开始,该元素可以认为已经被排序;

    2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;

    3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;

    4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

    5. 将新元素插入到该位置后;

    6. 重复步骤2~5。

    #include <stdio.h>
    void InsertSort(int* p, int n)
    {
        int temp,i,j;
        for (i = 0; i < n; i++)  //每个元素都需要来插入,故比较n次
        {
            temp = p[i];    //设置哨兵,为针对的第i个元素
            for (j = i - 1; (j >= 0) && (p[j] > temp); j--)  //将于哨兵前面的有序元素进行比较,如果要操作也仅仅是后移
            {
                p[j + 1] = p[j];
            }
            p[j + 1] = temp;   //for循环最后会--,所以待插入的位置为j+1
        }
    
    }
    
    int main()
    {
        int a[] = { 4,2,5,6,7,8,3,1,9 };
        InsertSort(a,9);
        printf_s("排序后:
    ");
        for (int i = 0; i < 9; i++)
        {
            printf_s("%d ", a[i]);
        }
    
        return 1;
    }

    空间上只需要一个记录辅助空间,所以关键看时间复杂度
    平均比较和移动次数约为(n^2)/4,所以时间复杂度为O(n^2)。
    其性能要比冒泡和简单选择排序好些

  • 相关阅读:
    css中优先级与层叠
    微服务通过feign.RequestInterceptor传递参数
    maven详解
    Java8新特性interface中的static方法和default方法
    设计模式六大原则---转
    MySQL主从复制作用和原理
    Mysql Binlog三种格式详细介绍
    分布式主键生成逻辑总结--转
    java幂等性的解决方案
    spring事务的传播机制新解
  • 原文地址:https://www.cnblogs.com/lemonzhang/p/12399183.html
Copyright © 2020-2023  润新知