其他分享
首页 > 其他分享> > 视频+图文+动画 详解插入排序(轻松易理解系列)

视频+图文+动画 详解插入排序(轻松易理解系列)

作者:互联网

目录

一、视频讲解插入排序

点击这里去B站观看视频~~

二、插入排序的思想

三、插入排序的动画演示及思路分析

动画演示:

橙色的数字:有序表中的数字
粉色的数字:每轮无序表的第一个数
绿色的数字:有序表中需与无序表粉色数字进行比较的数
在这里插入图片描述

思路分析:以7,3,22,15,8为例

为了便于理解代码,在这里我们需用两个变量:

第一次排序:拿出无序表中的第1个元素3,与有序表的元素7进行比较

原始数组7,3,22,15,8

有序表:7 insertIndex:1-1=0 (从此下标开始往前找合适的位置)
无序表:3,22,15,8 insertValue (待插入的数):arr[1]–>3

在这里插入图片描述

排序结果: 3,7,22,15,8

第二次排序:拿出无序表中的第1个元素22,与有序表的元素3,7进行比较

原始数组3,7,22,15,8

有序表:3,7 insertIndex:2-1=1 (从此下标开始往前找合适的位置)
无序表:22,15,8 insertValue (待插入的数):arr[2]–>22

在这里插入图片描述

排序结果: 3,7,22,15,8

第三次排序:拿出无序表中的第1个元素15,与有序表的元素3,7,22进行比较

原始数组3,7,22,15,8

有序表:3,7,22 insertIndex:3-1=2 (从此下标开始往前找合适的位置)
无序表:15,8 insertValue (待插入的数):arr[3]–>15

在这里插入图片描述

排序结果: 3,7,15,22,8

第四次排序:拿出无序表中的第1个元素8,与有序表的元素3,7,15,22进行比较

原始数组3,7,15,22,8

有序表:3,7,15,,22 insertIndex:4-1=3 (从此下标开始往前找合适的位置)
无序表:8 insertValue (待插入的数):arr[4]–>8

在这里插入图片描述

排序结果: 3,7,15,22,8

四、插入排序的代码+代码优化+代码详解

代码--————多个while循环分别控制排序:

package Sort;

import java.util.Arrays;

public class InsertSort {

	public static void main(String[] args) {
		int arr[] = { 7, 3, 22, 15, 8 };
		int insertValue = 0; //(无序表的第一个值)待插入的值
		int insertIndex = 0; //从这里开始查找待插入值的下标

		 //第一次排序
		insertValue = 3;
		insertIndex = 1-1;
		while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
			arr[insertIndex + 1] = arr[insertIndex]; //将7后移一个位置,arr[1]=7
			insertIndex--;
		}
		 //退出while循环,待插入的数的下标确定
		arr[insertIndex + 1] = insertValue;
		System.out.println("第一次排序的结果为:"+Arrays.toString(arr));
		
		 //第二次排序
				insertValue = 22;
				insertIndex = 2-1;
				while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
					arr[insertIndex + 1] = arr[insertIndex];
					insertIndex--;
				}
				 //退出while循环,待插入的数的下标确定
				arr[insertIndex + 1] = insertValue;
				System.out.println("第二次排序的结果为:"+Arrays.toString(arr));
				
				 //第三次排序
				insertValue = 15;
				insertIndex = 3-1;
				while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
					arr[insertIndex + 1] = arr[insertIndex]; //将22后移一个位置,arr[3]=22
					insertIndex--;
				}
				 //退出while循环,待插入的数的下标确定
				arr[insertIndex + 1] = insertValue;
				System.out.println("第三次排序的结果为:"+Arrays.toString(arr));
				
				 //第四次排序
				insertValue = 8;
				insertIndex = 4-1;
				while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
					//将22后移一个位置即arr[4]=22;15也后移一个位置即arr[3]=15
					arr[insertIndex + 1] = arr[insertIndex]; 
					insertIndex--;
				}
				 //退出while循环,待插入的数的下标确定
				arr[insertIndex + 1] = insertValue;
				System.out.println("第四次排序的结果为:"+Arrays.toString(arr));

	}

}

结果:

在这里插入图片描述

优化代码--————for循环嵌套while循环控制排序:

优化分析:

根据下表红色数据部分,我们可以看出:

insertValue:无序表中第一个数即待插入的数 insertIndex:从此下标开始往前找合适的位置
第一次排序 arr[1]=3 1-1=0
第二次排序 arr[2]=22 2-1=1(0-1)
第三次排序 arr[3]=15 3-1=2(0-2)
第四次排序 arr[4]=8 4-1=3(0-3)

代码:

package Sort;

import java.util.Arrays;

public class InsertSort {

	public static void main(String[] args) {
		int arr[] = { 7, 3, 22, 15, 8 };
		int insertValue = 0; //(无序表的第一个值)待插入的值
		int insertIndex = 0; //从这里开始查找待插入值的下标
		for (int i = 1; i < arr.length; i++) {
			insertValue = arr[i];
			insertIndex = i - 1;
			while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
				arr[insertIndex + 1] = arr[insertIndex]; 
				insertIndex--;
			}
			 //退出while循环,待插入的数的下标确定
			if (insertIndex + 1 != i) {//如果insertIndex + 1 != i说明此数在正确位置上不用交换
				arr[insertIndex + 1] = insertValue;
			}
			System.out.println("第" + i + "次排序的结果为:" + Arrays.toString(arr));
		}
	}

}

结果:

在这里插入图片描述

代码详解(优化版本):以7,3,22,15,8为例

第一次排序时:

while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
				arr[insertIndex + 1] = arr[insertIndex]; 
				insertIndex--;
			}
if (insertIndex + 1 != i) {//如果insertIndex + 1 != i说明此数在正确位置上不用交换
				arr[insertIndex + 1] = insertValue;
			}

第二次排序时:

while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
				arr[insertIndex + 1] = arr[insertIndex]; 
				insertIndex--;
			}

3,7,22,15,8 --> 3,7,22,15,8

if (insertIndex + 1 != i) {//如果insertIndex + 1 != i说明此数在正确位置上不用交换
				arr[insertIndex + 1] = insertValue;
			}

第三次排序时:

while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
				arr[insertIndex + 1] = arr[insertIndex]; 
				insertIndex--;
			}
if (insertIndex + 1 != i) {//如果insertIndex + 1 != i说明此数在正确位置上不用交换
				arr[insertIndex + 1] = insertValue;
			}

3,7,22,22,8 --> 3,7,15,22,8

第四次排序时:

while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
				arr[insertIndex + 1] = arr[insertIndex]; 
				insertIndex--;
			}
if (insertIndex + 1 != i) {//如果insertIndex + 1 != i说明此数在正确位置上不用交换
				arr[insertIndex + 1] = insertValue;
			}

3,7,15,15,22 --> 3,7,8,15,22

到此插入排序就讲解完了~~

标签:动画,insertIndex,15,22,插入排序,arr,while,insertValue,图文
来源: https://www.cnblogs.com/Qpgshare/p/12730307.html