插入排序 详解

目录

一.简单释义

二.核心思想

三.问题描述

四.算法描述

五.代码实现

六.时间复杂度

七.空间复杂度


一.简单释义

1.算法目的

将原本乱序的数组变成有序,可以是 升序 或者 降序。

2.算法思想

通过不断的将当前元素插入到升序或降序 序列中直到所有的元素都执行过 插入 操作,则算结束。

3.命名由来

每次都是将元素 插入 到 有序 序列中,故此命名 插入排序。

二.核心思想

迭代:类似的事情,不停的做。

比较:关系运算符 小于等于 或大于等于的运用。

移动:原地后移元素。

三.问题描述

给定n个元素的数组,数组下标从0开始,采用插入排序,将数组按照升序排列.

四.算法描述

n个元素 只需要比较n-1次,就可以排好序.

第一个元素本来就有序不用排列.

从第二个元素开始,第二个元素和第一个元素比较,如果第二个元素小于第一个元素,第一个元素往后移动,第二个元素往前插入,如果第二个元素大于第一个元素,就开始下一轮.

然后第三个元素和第二个元素比较,小于第二个元素的话,第二个元素往后移,第三个元素往前插入.然后比较第三个元素和第一个元素的大小,比第一个元素小的话,第一个元素往后移动,第三个元素往前插入, 大的话就结束这一轮. 如果第三个元素大于第二个,则直接进入第四伦.

就这样直到n-1 次循环结束.

五.代码实现

#include 

int a[1010];   //定义一个数组

// 在数组里面,输入一些数
void Input(int n, int *a) {   
    for(int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
    }
}
// 将数组重的元素 输出
void Output(int n, int *a) {
    for(int i = 0; i < n; ++i) {
        if(i)
            printf(" ");
        printf("%d", a[i]);
    }
    puts("");
}
// 实现数组内元素的 升序排列  插入算法
void InsertSort(int n, int *a) {       
    int i, j; 
    for(i = 1; i < n; ++i) {
        int x = a[i];                  
        for(j = i-1; j >= 0; --j) {   
            if(x <= a[j]) {            
                a[j+1] = a[j];         
            }else
                break;                 
        }
        a[j+1] = x;                   
    }
} 

int main() {
    int n;
    while(scanf("%d", &n) != EOF) {
        Input(n, a);
        InsertSort(n, a);
        Output(n, a);
    }
    return 0;
} 

六.时间复杂度

外圈进行n-1次迭代

当i =1, 内圈进行 j=1次 比较操作.

当i =2, 内圈进行 j=2次 比较操作.

当i =3, 内圈进行 j=次 比较操作.

当i =n-1, 内圈进行 j=n-1次 比较操作.

因此,总的比较次数 采用 等比数列公式

 总的时间复杂度 O(n^2)

七.空间复杂度

由于算法执行过程中,只有移动变量的时候,需要事先将变量存入零时变量X中,而其他没有采用任何的额外空间,所以空间复杂度O(1)

你可能感兴趣的:(排序算法,数据结构,算法)