目录 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]的数字改为keyarray[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示例截图