zoukankan      html  css  js  c++  java
  • 直接插入排序

    直接插入排序(Straight Insertion Sort)是一种很简单的排序算法。它的核心思想是:将已知数组元素插入到有序序列的合适位置中,从而形成一个新的有序序列。

    直接插入排序算法思想:

    将已知数组元素插入到有序序列的合适位置中,从而形成一个新的有序序列。

    直接插入排序算法举例:

    以序列A:{ 1,2,4,6,3 }为例,叙述一遍直接插入排序的算法流程。

    1.1 首先寻找有序序列

    首先我们通过一次循环,找到{ 1,2,4,6 }为有序序列,而加上最后一个元素{ 3 }则为无序序列,因此,我们要对最后一个元素进行寻找它正确的位置。

    1.2 设置变量存储无序元素的值

    此时得知,元素a[4]为无序元素,因此设置一个变量 temp ,存储a[4]的值

    1.3 寻找无序元素正确的位置

    此时,我们应该寻找无序元素的正确位置。这时候,我们拿无序元素之前的每一个元素(本例中即a[3],a[2],a[1],a[0])与之(temp)比较,若大于之,则该元素后移。

    本例中,

    a[3]>temp,则a[3]后移,即a[3]的值赋予a[4]。

    然后比较a[2],a[2]>temp,则a[2]后移,即将a[2]的值赋予a[3]。

    然后比较a[1],a[1]<temp,则temp应该放到a[2]处,即a[2]=temp;

    排序结束。

    代码实现:

    #include<stdio.h>
    
    //输出数组
    void printArr(int a[], int n)
    {
        for (int i = 0; i < n; i++)
        {
            printf("%d--", a[i]);
        }
        printf("
    ");
    }
    
    // 直接插入排序
    void InsertSort(int *a, int n)
    {
        int i, j, temp;
        for (int i = 1; i < n; i++)//从第二个元素开始,依次与前一个元素比大小
        {
            if (a[i] < a[i - 1])//若前面的元素大于后面的元素,则寻找后面元素本应正确的位置
            {
                temp = a[i];
                for (j = i - 1; j >= 0 && a[j] > temp; j--)
                {
                    a[j + 1] = a[j];
                }
                a[j + 1] = temp;//将无序元素放入到正确的位置
            }
        }
    
        printArr(a, n);
    }
    
    void main()
    {
        //直接插入
        int aa[] = { 1,2,4,6,3 };
        int n = sizeof(aa) / sizeof(aa[0]);
        InsertSort(aa, n);
    
        getchar();
    }

    时间复杂度:

    最好情况:O(n)

    最坏情况:O(n^2)

    平均情况:O(n^2)

    稳定性:

    直接插入排序是一种稳定的排序算法。

  • 相关阅读:
    sshkey批量分发,管理方案
    sersync 配合rsync实时同步备份
    全网实时热备inotify+rsync
    rsync定时同步配置
    全网NFS存储架构详解与分析
    linux新装系统初始化
    Cannot create a secure XMLInputFactory --CXF调用出错
    POJ 2187 /// 凸包入门 旋转卡壳
    POJ 1127 /// 判断线段与线段是否相交
    POJ 2398 map /// 判断点与直线的位置关系
  • 原文地址:https://www.cnblogs.com/zh1996/p/8364884.html
Copyright © 2011-2022 走看看