目录
1. 说明 2. 举个例子 3. java代码示例 4. java示例截图
1. 说明
1.直接插入排序的方式和打牌一样,刚开始数组为空 2.拿到一个数字后从左到右将它与数组中的每一个数字进行比较,然后插入合适的位置 3.到最后,数组按照既定的顺序排序好
2. 举个例子
示例: [5, 3, 4, 1, 2] 1. 获取数组的长度5,从第二个数开始循环操作 2. 取下一个比较的值3,索引i为1,上一个索引j为0 3.判断5是否大于3,则索引为1的数字改为5,得到 [5, 5, 4, 1, 2],j=j-1=-1,j<0跳出循环 4.将索引0的位置的数字改为3,得到[3, 5, 4, 1, 2] 5. 取下一个比较的值4,索引i为2,上一个索引j为1 (索引0到索引j都是有序的) 6. 比较索引1位置的数字,5大于4,将索引2位置的数字改为5(往后挪一位),得到[3, 5, 5, 1, 2],j=j-1=0 7. 比较索引0位置的数字,3小于4,跳出循环 8. 将索引1位置的数字改为4,得到[3, 4, 5, 1, 2] 9. 取下一个比较的值1,索引i为3,上一个索引j为2 (索引0到索引j都是有序的) 10. 比较索引2位置的数字,5大于1,将索引3位置的数字改为5(往后挪一位),得到[3, 4, 5, 5, 2],j=j-1=1 11. 比较索引1位置的数字,4大于1,将索引2位置的数字改为4(往后挪一位),得到[3, 4, 4, 5, 2],j=j-1=0 12. 比较索引0位置的数字,3大于1,将索引1位置的数字改为3(往后挪一位),得到[3, 3, 4, 5, 2],j=j-1=-1,j<0跳出循环 13. 将索引0位置的数字改为1,得到[1, 3, 4, 5, 2] 14. 取下一个比较的值2,索引i为4,上一个索引j为3(索引0到索引j都是有序的) 15. 比较索引3位置的数字,5大于2,将索引4位置的数字改为5(往后挪一位),得到[1, 3, 4, 5, 5],j=j-1=2 16. 比较索引2位置的数字,4大于2,将索引3位置的数字改为4(往后挪一位),得到[1, 3, 4, 4, 5],j=j-1=1 17. 比较索引1位置的数字,3大于2,将索引2位置的数字改为3(往后挪一位),得到[1, 3, 3, 4, 5],j=j-1=0 18. 比较索引0位置的数字,1小于2,跳出循环 19. 将索引1位置的数字改为2,得到[1, 2, 3, 4, 5]
3. java代码示例
package com.learning.algorithm.sort;
/**
* 直接插入排序
* 示例: 5, 3, 4, 1, 2
* 1.获取数组的长度5,从第二个数开始循环操作
* ===开始循环===
* 2.取下一个比较的值3,索引i为1,上一个索引j为0
* 3.判断5是否大于3,则索引为1的数字改为5,得到 [5, 5, 4, 1, 2],j=j-1=-1,j<0跳出循环
* 4.将索引0的位置的数字改为3,得到[3, 5, 4, 1, 2]
* ===继续循环===
* 5.取下一个比较的值4,索引i为2,上一个索引j为1 (索引0到索引j都是有序的)
* 6.比较索引1位置的数字,5大于4,将索引2位置的数字改为5(往后挪一位),得到[3, 5, 5, 1, 2],j=j-1=0
* 7.比较索引0位置的数字,3小于4,跳出循环
* 8.将索引1位置的数字改为4,得到[3, 4, 5, 1, 2]
* ===继续循环===
* 9.取下一个比较的值1,索引i为3,上一个索引j为2 (索引0到索引j都是有序的)
* 10.比较索引2位置的数字,5大于1,将索引3位置的数字改为5(往后挪一位),得到[3, 4, 5, 5, 2],j=j-1=1
* 11.比较索引1位置的数字,4大于1,将索引2位置的数字改为4(往后挪一位),得到[3, 4, 4, 5, 2],j=j-1=0
* 12.比较索引0位置的数字,3大于1,将索引1位置的数字改为3(往后挪一位),得到[3, 3, 4, 5, 2],j=j-1=-1,j<0跳出循环
* 13.将索引0位置的数字改为1,得到[1, 3, 4, 5, 2]
* ===继续循环===
* 14.取下一个比较的值2,索引i为4,上一个索引j为3(索引0到索引j都是有序的)
* 15.比较索引3位置的数字,5大于2,将索引4位置的数字改为5(往后挪一位),得到[1, 3, 4, 5, 5],j=j-1=2
* 16.比较索引2位置的数字,4大于2,将索引3位置的数字改为4(往后挪一位),得到[1, 3, 4, 4, 5],j=j-1=1
* 17.比较索引1位置的数字,3大于2,将索引2位置的数字改为3(往后挪一位),得到[1, 3, 3, 4, 5],j=j-1=0
* 18.比较索引0位置的数字,1小于2,跳出循环
* 19.将索引1位置的数字改为2,得到[1, 2, 3, 4, 5]
*/
public class DirectInsertSort {
public static void sort(int array[]) {
// 获取数组的长度
int length = array.length;
// 从第二位开始比较
for (int i = 1; i < length; ++i) {
// 获取下一个比较的值
int key = array[i];
// 上一个索引
int j = i - 1;
// 比较到索引大于等于0的 且 遍历前面的值 与 key比较大小,如果比key大,大的值往后挪一位
while (j >= 0 && array[j] > key) {
// 比key大的值往后挪一位
array[j + 1] = array[j];
// 继续比较前面的值和key的大小
j = j - 1;
}
// 当array[j]比key小,则array[j+1]的数字改为key
array[j + 1] = key;
}
}
/* A utility function to print array of size n*/
public static void print(int[] array) {
for (int i : array) {
System.out.print(i + " ");
}
}
public static void main(String args[]) {
int array[] = {5, 3, 4, 1, 2};
DirectInsertSort.sort(array);
DirectInsertSort.print(array);
}
}
4. java示例截图