标签:自己 码代码 部分 变化 www while循环 ack color tps
橙色的数字:有序表中的数字
粉色的数字:每轮无序表的第一个数
绿色的数字:有序表中需与无序表粉色数字进行比较的数
为了便于理解代码,在这里我们需用两个变量:
原始数组:7,3,22,15,8
有序表:7 | insertIndex:1-1=0 (从此下标开始往前找合适的位置) |
---|---|
无序表:3,22,15,8 | insertValue (待插入的数):arr[1]–>3 |
排序结果: 3,7,22,15,8
原始数组:3,7,22,15,8
有序表:3,7 | insertIndex:2-1=1 (从此下标开始往前找合适的位置) |
---|---|
无序表:22,15,8 | insertValue (待插入的数):arr[2]–>22 |
排序结果: 3,7,22,15,8
原始数组:3,7,22,15,8
有序表:3,7,22 | insertIndex:3-1=2 (从此下标开始往前找合适的位置) |
---|---|
无序表:15,8 | insertValue (待插入的数):arr[3]–>15 |
排序结果: 3,7,15,22,8
原始数组:3,7,15,22,8
有序表:3,7,15,,22 | insertIndex:4-1=3 (从此下标开始往前找合适的位置) |
---|---|
无序表:8 | insertValue (待插入的数):arr[4]–>8 |
排序结果: 3,7,15,22,8
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));
}
}
根据下表红色数据部分,我们可以看出:
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));
}
}
}
while (insertIndex >= 0 && insertValue < arr[insertIndex])
进入while循环while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex+1]=arr[insertIndex]即将原来arr[1]=3换为现在的arr[1]=7
7,3,22,15,8 -->7,3,22,15,8 --> 3,7,22,15,8
insertIndex--后InsertIndex=-1
不满足while循环条件,退出while循环,待插入数:3的位置找到即arr[0]=3
因为此时insertIndex=-1,满足if (insertIndex + 1 != i)
进入if分支语句
if (insertIndex + 1 != i) {//如果insertIndex + 1 != i说明此数在正确位置上不用交换
arr[insertIndex + 1] = insertValue;
}
所以arr[insertIndex+1]=insertValue 即arr[0]=3
输出第一次排序的结果:3,7,22,15,8 --> 3,7,22,15,8
while (insertIndex >= 0 && insertValue < arr[insertIndex])
不进入while循环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)
不进入if分支语句if (insertIndex + 1 != i) {//如果insertIndex + 1 != i说明此数在正确位置上不用交换
arr[insertIndex + 1] = insertValue;
}
所以本次排序不发生交换
输出第二次排序的结果:3,7,22,15,8 --> 3,7,22,15,8
while (insertIndex >= 0 && insertValue < arr[insertIndex])
进入while循环while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex+1]=arr[insertIndex]即将原来arr[3]=15换为现在的arr[3]=22
3,7,22,15,8 --> 3,7,22,15,8 --> 3,7,22,22,8
insertIndex--后InsertIndex=1但insertValue=15>arr[insertIndex]=arr[1]=7
3,7,22,22,8 --> 3,7,22,22,8
不满足while循环条件,退出while循环,待插入数:15的位置找到即arr[2]=15
因为此时insertIndex=1,满足if (insertIndex + 1 != i)
进入if分支语句
if (insertIndex + 1 != i) {//如果insertIndex + 1 != i说明此数在正确位置上不用交换
arr[insertIndex + 1] = insertValue;
}
3,7,22,22,8 --> 3,7,15,22,8
所以arr[insertIndex+1]=insertValue 即arr[2]=15
输出第三次排序的结果:3,7,15,22,8
while (insertIndex >= 0 && insertValue < arr[insertIndex])
进入while循环while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex+1]=arr[insertIndex]即将原来arr[3]=22换为现在的arr[4]=22
3,7,15,22,8 --> 3,7,15,22,8 --> 3,7,15,22,22
insertIndex--后InsertIndex=2且insertValue=8<arr[insertIndex]=arr[2]=15
满足while循环条件,进入while循环,
arr[insertIndex+1]=arr[insertIndex]即将原来arr[3]=22换为现在的arr[3]=15
3,7,15,22,22 --> 3,7,15,22,22 --> 3,7,15,15,22
insertIndex--后InsertIndex=1但insertValue=8>arr[insertIndex]=arr[1]=7
不满足while循环条件,退出while循环,待插入数:8的位置找到即arr[2]=8
因为此时insertIndex=1,满足if (insertIndex + 1 != i)
进入if分支语句
if (insertIndex + 1 != i) {//如果insertIndex + 1 != i说明此数在正确位置上不用交换
arr[insertIndex + 1] = insertValue;
}
3,7,15,15,22 --> 3,7,8,15,22
所以arr[insertIndex+1]=insertValue 即arr[2]=8
输出第四次排序的结果:3,7,8,15,22
到此插入排序就讲解完了~~
标签:自己 码代码 部分 变化 www while循环 ack color tps
原文地址:https://www.cnblogs.com/Qpgshare/p/12730307.html