数据结构与算法 ——插入排序

插入排序

一、概念

基础概念:插入排序,从序列中第二个数A开始,将A插入前面已经排序好的序列中,形成一个新的排序好的序列,以此类推到最后一个元素。

通俗理解:因为是插入排序,所以必须是要有一个排序好的序列,然后我们执行插入操作,使得插入后的序列依然有序

通俗的理解,就好像在玩扑克牌游戏一样

  1. 一开始还未发牌的时候,每个人手上都是没有牌的。对应着: 数组一开始还未排序,所以数组是无序的。
  2. 而从你拿到第一张牌之后,你的牌从现在开始就是有序的了。(一张牌也是有序的) 对应着:数组第一个元素的位置一开始是不动的(为什么是从第二个元素开始进行比较)
  3. 接下来当你拿到第二张牌,你会先看一下是不是比第一张牌大。如果比第一张牌大的话,就放到第一张牌后面;否则就放到第一张牌的前面。以此类推…直到拿到所有的牌。 对应着:数组每拿到一个待插入元素,就与前面的有序序列进行比较,找到属于它的位置。

二、代码及过程

/**
*
*插入排序
*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)

猜你喜欢

转载自blog.csdn.net/weixin_43725997/article/details/89295184