插入排序
一、概念
基础概念:插入排序,从序列中第二个数A开始,将A插入前面已经排序好的序列中,形成一个新的排序好的序列,以此类推到最后一个元素。
通俗理解:因为是插入排序,所以必须是要有一个排序好的序列,然后我们执行插入操作,使得插入后的序列依然有序。
通俗的理解,就好像在玩扑克牌游戏一样
- 一开始还未发牌的时候,每个人手上都是没有牌的。对应着: 数组一开始还未排序,所以数组是无序的。
- 而从你拿到第一张牌之后,你的牌从现在开始就是有序的了。(一张牌也是有序的) 对应着:数组第一个元素的位置一开始是不动的(为什么是从第二个元素开始进行比较)
- 接下来当你拿到第二张牌,你会先看一下是不是比第一张牌大。如果比第一张牌大的话,就放到第一张牌后面;否则就放到第一张牌的前面。以此类推…直到拿到所有的牌。 对应着:数组每拿到一个待插入元素,就与前面的有序序列进行比较,找到属于它的位置。
二、代码及过程
/**
*
*插入排序
*Date: 2019/4/14
*
***/
#include <stdio.h>
// 插入排序
void insertSort(int *a, int n){
int i,j; // 循环变量
int temp;
for(i = 1; i < n; i++){ // 第二个数开始
temp = a[i]; // 将待插入数据取出,作为比较数
j = i-1;
while(j >= 0 && temp < a[j]){
// 将待插入数据与前一个数据比较
// 如果前一个数据比较大,则向后挪动一位,腾出位置
a[j+1] = a[j];
j--;
}
a[j+1] = temp; // 找到插入位置,插入数据
}
}
// 遍历数组
void show(int *a,int n){
for(int i = 0; i < n; i++){
printf("%5d",a[i]);
}
}
void main(){
int a[] = {35,22,17,-20,22,99,46};
int n = sizeof(a) / sizeof(a[0]); // 数组长度
printf("原数组:\n");
show(a,n);
insertSort(a,n);
printf("\n排序后的数组:\n");
show(a,n);
printf("\n");
}
三、复杂度
平均时间复杂度:O(n²)
空间复杂度: O(1)