直接插入排序

直接插入排序(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)

稳定性:

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

原文地址:https://www.cnblogs.com/zh1996/p/8364884.html