插入排序算法详解(从后往前)

插入排序算法详解(从后往前)

A. 把最后一个元素当成一个降序数组-----降序

1.核心代码

 for (int i = 0; i <numbers.length-1; i++) {//j的初始值的位置为倒数第二个元素位置-i,随着i的变化往前走//交换的最多次数为i+1次for (int j =numbers.length-2-i;j<numbers.length-1;j++) {if(numbers[j]<numbers[j+1]){int temp=numbers[j];numbers[j]=numbers[j+1];numbers[j+1]=temp;}else{break;}}
}

2.常见问题点分析

2.1 如何进行插入排序???

解决方案: 1.把最后一个元素当成降序数组

​ 2.拿紧邻的元素p(左边紧邻)与降序数组组合一起当成成一个新数组

​ 3.拿p与原数组里面的每一个数进行比较大小(比较顺序为从前往后)

​ 若比它小,就进行交换(大者在前,为降序)

​ 否则无需执行后面的循环操作了

​ 此时可以把组合在一起的结果当成一个新的降序数组

​ 否则的理由:因为p大于等于原降序数组里面的第一个元素了,

​ 那么此时后面的继续比较就没有任何意义了(再这么比较也不会有任何变化的)

​ 循环往复执行上述步骤2,3,直至满足循环次数=数组长度-1,循环才结束

2.2 插入排序的循环次数为多少?

解决方案:循环次数=数组长度-1

2.3 插入排序具体操作(数字是这么移动的)过程

以数组int[] a=[1,22,6,4,88]为列

排序次数需要排序的数组部分排序前的数组排序后的数组
第1次[4,88][1,22,6,4,88][1,22,6,88,4]
第2次[6,88,4][1,22,6,88,4][1,22,88,6,4]
第3次[22,88,6,4][1,22,88,6,4][1,88,22,6,4]
第4次[1,88,22,6,4][1,88,22,6,4][88,22,6,4,1]

2.4 为什么核心代码第10行要使用break跳出当前循环???

解决方案:因为默认为降序,且紧邻元素p比原数组的第一个元素的数据都大,

​ 那么就没有任何交换的必要了。

2.5 内层循环为啥是从numbers.length-2-i开始?

解答: a.每次都是从紧邻元素与原数组的第一个位置进行比较大小开始的

​ b.且每次新的紧邻元素会每次往前移动一个,这与i的变化规律一致

​ c.第一次的紧邻元素为倒数第二个即numbers.length-1-1

2.6 紧邻元素与降序数组组合一起的新数组需要进行比较大小几次,才能得到新的降序数组??

解答: 假设数组长度为5

​ 当紧邻元素位置为numbers.length-1-0=4时,需要比较1次
​ 当紧邻元素位置为numbers.length-1-1=3时,需要比较2次

​ …

​ 当紧邻元素位置为numbers.length-1-i时,需要比较i+1次

​ 因而需要比较i+1次(内层循环j不可以取值到最后一个元素)

3.运行截图

在这里插入图片描述

4.源代码

public class InsertSort03 {public static void main(String[] args) {//核心就是保证每次需要加入的新元素的位置能进行顺利往前移动System.out.println("插入排序之从后往前排序(尾元素为降序数组)");int[] numbers={1,22,6,4,88};System.out.println("排序前:");for (int temp01:numbers) {System.out.print(temp01+"\t");}for (int i = 0; i <numbers.length-1; i++) {for (int j =numbers.length-2-i;j<numbers.length-1;j++) {//保证大者位于靠前的位置if(numbers[j]<numbers[j+1]){int temp=numbers[j];numbers[j]=numbers[j+1];numbers[j+1]=temp;}else{break;}}System.out.println("\n第"+(i+1)+"次排序后");for (int temp02:numbers) {System.out.print(temp02+"\t");}}System.out.println("\n排序后:");for (int temp03:numbers) {System.out.print(temp03+"\t");}}
}

B. 把最后一个元素当成一个升序数组-----升序

1.核心代码

for (int i = 0; i <numbers.length-1; i++) {for (int j =numbers.length-2-i;j<numbers.length-1;j++) {//保证小者在前,为升序if(numbers[j]>numbers[j+1]){int temp=numbers[j];numbers[j]=numbers[j+1];numbers[j+1]=temp;}else{break;}}
}

2.常见问题点分析

2.1 如何进行插入排序???

解决方案: 1.把最后一个元素当成升序数组

​ 2.拿紧邻的元素p与升序数组组合一起当成成一个新数组

​ 3.拿p与原数组里面的每一个数进行比较大小,(比较大小的顺序为从前往后)

​ 若比它大,就进行交换(小者在前,为升序)

​ 否则无需执行后面的循环操作了,

​ 此时可以把组合的结果当成一个新的升序数组

​ 否则的理由:因为p小于等于原升序数组里面的第一个数字了,

​ 那么此时后面的继续比较就没有任何意义了(再这么比较也不会有任何变化的)

​ 循环往复执行上述步骤2,3,直至满足循环次数=数组长度-1,循环才结束

2.2 插入排序的循环次数为多少?

解决方案:循环次数=数组长度-1

2.3 插入排序具体操作(数字是这么移动的)过程

以数组int[] a=[16,11,18,9,8]为列

排序次数需要排序的数组部分排序前的数组排序后的数组
第1次[9,8][16,11,18,9,8][16,11,18,8,9]
第2次[18,8,9][16,11,18,8,9][16,11,8,9,18]
第3次[11,8,9,18][16,11,8,9,18][16,8,9,11,18]
第4次[16,8,9,11,18][16,8,9,11,18][8,9,11,16,18]

2.4 为什么核心代码第9行要使用break跳出当前循环???

解决方案:因为默认有序为升序,且紧邻元素p比原数组的第一个数据都小,

​ 那么就没有任何交换的必要了。

2.5 内层循环为啥是从numbers.length-2-i开始?

解答: a.每次都是从紧邻元素与原数组的第一个位置进行比较大小开始的

​ b.且每次新的紧邻元素会每次往前移动一个,这与i的变化规律一致

​ c.第一次的紧邻元素为倒数第二个即numbers.length-1-1

2.6 紧邻元素与升序数组组合一起的新数组需要进行比较大小几次,才能得到新的升序数组??

解答: 假设数组长度为5

​ 当紧邻元素位置为numbers.length-1-0=4时,需要比较1次
​ 当紧邻元素位置为numbers.length-1-1=3时,需要比较2次

​ …

​ 当紧邻元素位置为numbers.length-1-i时,需要比较i+1次

​ 因而需要比较i+1次(内层循环j不可以取值到最后一个元素)

3.运行截图

在这里插入图片描述

4.源代码

public class InsertSort04 {public static void main(String[] args) {//核心就是保证每次需要加入的新元素能进行顺利移动//内层循环通常比较次数为i+1次System.out.println("插入排序之从后往前排序(尾元素为升序数组)");int[] numbers={16,11,18,9,8};System.out.println("排序前:");for (int temp01:numbers) {System.out.print(temp01+"\t");}for (int i = 0; i <numbers.length-1; i++) {for (int j =numbers.length-2-i;j<numbers.length-1;j++) {if(numbers[j]>numbers[j+1]){int temp=numbers[j];numbers[j]=numbers[j+1];numbers[j+1]=temp;}else{break;}}System.out.println("\n第"+(i+1)+"次排序后");for (int temp02:numbers) {System.out.print(temp02+"\t");}}System.out.println("\n插入排序后(从后往前)的结果为:");for (int temp03:numbers) {System.out.print(temp03+"\t");}}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部