[数据结构与算法]10 直接插入排序( Java 版)
直接插入排序,当你看到这几个字的时候,首先第一想法是什么?
我第一想法是在我斗地主的时候,比如我的牌是 5,J,K 下一张牌是 8 ,那我就直接把它放在 5 和 J 之间,此时手里面的牌就是 5,8,J,K 再来一张牌是 4 ,那就放在最前面,此时是 4,5,8,J,K 又来一张牌是 10 ,那就直接把它放在 8 和 J 之间,就是 5,8,10,J,K .(原谅我有点儿强迫症,一定要把牌从大到小码好才觉得顺眼)
发现规律了嘛?在我手里面的牌是有序的,没有在我手里面的牌则是无序的,然后我一张一张的从无序的牌里面抽出来,然后和我手里面的牌进行比较,看看抽到的这张牌将它放在哪个位置比较好.
如果找到了合适的位置,就直接插入进去就可以了.
上面的这个过程,就是直接插入排序的体现.
上面的描述比较口语化,咱们用术语来说一下原理(显得我比较有文化,哈哈哈):
- 将 n 个待排序的元素看成是一个有序表和无序表
- 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使得有序表从整体来看依然有序.
- 第一趟比较前两个数,然后把第二个数按照大小插入到有序表中;第二趟将第三个数据与前面两个数据进行比较,将第三个数据插入到有序表合适的位置中
- 按照这样的步骤依次进行下去,进行了 n-1 趟扫描以后,就整个待排序列排好了.
从上面的步骤中,应该能够体会到,直接插入排序有两层嵌套循环.
第一层是外循环,标识待比较的数值,也就是从无序表中取出来的那个值.
第二层是内循环,是为了确定从无序表中取出的值的最终位置.
但是外循环是从第二个数开始比较的,因为直接插入排序是将待比较的数值与它的前一个数值进行比较,如果没有前一个数值,也就没有直接插入排序这一说.
OK ,理论知识补充完毕了,咱们来看看代码上是如何实现的:
/**
* 直接插入排序代码实现
* @author 郑璐璐
* @date 2020-1-25 11:39:13
*/
public class StraightInsert {
public static void straightInsert(int[] arr){
// 定义变量
int i , j , insertNote;
// 从数组的第二个元素开始循环,将数组中的元素插入
for (i=1;i<arr.length;i++){
// 第一次循环,假设第 2 个元素为要插入的元素
insertNote = arr[i];
j = i - 1;
while (j>=0 && insertNote < arr[j]){
// 如果要插入的元素小于第 j 个元素,就将第 j 个元素向后移动
arr[j+1] = arr[j];
j--;
}
// 要插入的元素大于第 j 个元素时,将要插入的数据插入到数组中
arr[j+1] = insertNote;
}
}
public static void main(String[] args){
int[] arr ={1,8,95,45,78,56,23,456,741,16};
straightInsert(arr);
for (int i : arr) {
System.out.println(i);
}
}
}
以上,就是想要分享的内容啦~
感谢您的阅读哇
有什么更好的实现方法更欢迎评论区交流~