【十大排序算法】插入排序

插入排序(Insert Sort)

视频讲解链接:【十大排序算法】用可视化动画讲插入排序

1、介绍

​ 将待排序的元素以插入的方式找寻该元素的适当位置,来达到排序的目的。

2、算法步骤

​ 把 n 个待排序的元素看成一个有序序列和一个无序序列,开始时有序序列中只包含一个元素,无序序列中包含有 n-1 个元素,排序过程中每次从无序序列中取出第一个元素,把它的值依次与有序序列元素的值进行比较,将它插入到有序序列中的适当位置,经过n-1轮插入,直到所有元素插入完为止。

3、代码实现

1、Java版代码

package sort;

import java.util.Arrays;

public class InsertSort {
	
	public static void main(String[] args) {
		int[] arr = {44,82,37,59,5,36}; 
		insertSort(arr);
		System.out.println(Arrays.toString(arr));
	}
	
	public static void insertSort(int[] arr) {
		
		/**
		 * compareIndex:比较值的下标
		 * readyInsertVal:待插入值
		 * readyInsertIndex:待插入值下标
		 */
		
		int compareIndex;
		int readyInsertVal;
		
		// 从1开始,循环 n-1 轮,每次从无序序列中选出第一个值作为待插入值
		for (int readyInsertIndex = 1; readyInsertIndex < arr.length; readyInsertIndex++) {
			
			// 每轮开始时,比较值为待插入值前一个
			compareIndex = readyInsertIndex - 1;
			readyInsertVal = arr[readyInsertIndex];
			
			// 找到适当位置,比较值的下标没有越界且待插入值小于比较值
			while (compareIndex >= 0 && readyInsertVal < arr[compareIndex]) {
				
				// 后移比较值
				arr[compareIndex + 1] = arr[compareIndex];
				// 更换比较值为前一个值
				compareIndex--;
			}
			
			// 待插入值插入到比较值的后面
			arr[compareIndex + 1] = readyInsertVal; 
		}
		
	}

}

2、C语言版代码

#include<stdio.h>
#define len 6
void insertSort(int arr[]) {

	/**
	 * compareIndex:比较值的下标
	 * readyInsertVal:待插入值
	 * readyInsertIndex:待插入值下标
	 */

	int compareIndex;
	int readyInsertVal;
	int readyInsertIndex;

	// 从1开始,循环 n-1 轮,每次从无序序列中选出第一个值作为待插入值
	for (readyInsertIndex = 1; readyInsertIndex < len; readyInsertIndex++) {

		// 每轮开始时,比较值为待插入值前一个
		compareIndex = readyInsertIndex - 1;
		readyInsertVal = arr[readyInsertIndex];

		// 找到适当位置,比较值的下标没有越界且待插入值小于比较值
		while (compareIndex >= 0 && readyInsertVal < arr[compareIndex]) {

			// 后移比较值
			arr[compareIndex + 1] = arr[compareIndex];
			// 更换比较值为前一个值
			compareIndex--;
		}

		// 待插入值插入到比较值的后面
		arr[compareIndex + 1] = readyInsertVal;
	}
}
int main() {
	int arr[] = {44,82,37,59,5,36};
	int i;
	printf("排序后:\n");
	insertSort(arr);
	for(i=0; i < len; i++) {
		printf("%d  ", arr[i]);
	}
}

4、时空复杂度

时间复杂度:O(n2)

​ 双层循环

空间复杂度:O(1)

​ 排序过程中只用到几个辅助变量

5、稳定性

插入排序是稳定的排序算法

​ 稳定性:排序前两个值相等的元素的前后位置顺序和排序后它们两个的前后位置顺序相同

6、结束语

​ 打开微信扫描小程序码体验插入排序动画演示:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值