聊聊排序(一)——插入排序(Insertion Sort)

各种排序,老生常谈,但还是想自己撸一篇,记录下自己的想法。

正文开始


引自百度百科

插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。

解读:
外层循环从第二个元素向后,内层循环向前找合适位置插入。

比如要排序的数组是:{16, 33, 20, 5, 39}

开始;

第1次外层循环:取到33,33 > 16,结果:{16, 33, 20, 5, 39}

第2次外部循环:取到20,20 < 33,那就插入到33前面,此时数组是:{16, 20, 33, 5, 39},20再跟16比较,由于20 > 16,不做变动,结果仍是:{16, 20, 33, 5, 39}

第3次外层循环:取到5,5 < 33,那就插入到33前面,此时数组是:{16, 20, 5, 33, 39};5再跟20比较,由于5 < 20,那就插入到20前面,此时数组是:{16, 5, 20, 33, 39};5跟16比较,5 < 16,由于5 < 16,那就插入到16前面,此时数组是:{5, 16, 20, 33, 39}

第4次外层循环:取到39,39 > 33,不做变动,结果仍是:{5, 16, 20, 33, 39}

结束;

整个过程是外层循环控制选到元素,内层循环向前走决定该元素最终位置,结束内层循环的条件是该元素比内层循环遍历到元素大或者内层循环已经遍完第一元素了,这样每次外层循环元素定下来的时候,该元素的左侧的所有元素就已经是排好序的,所以内层循环只要拿着该元素向前逐一比对就可以找到正确的位置,然后进行数组的插入操作

所谓的数组的插入操作一般情况下是比如这样:

有数组:array = {4, 2, 3, 1},想把元素1插入到2前面,做的操作是把1拎出来单独存一份到临时变量:a = 1,把2的位置也存到临时变量index = 1;

把2(包括)之后到1(不包括)的元素向后移一位,此时元素1就被元素3覆盖了,此时数组:array = {4, 2, 2, 3};

最后把元素1存到原先元素2的位置,即执行:array[index] = a,结果:array = {4, 1, 2, 3};

但在插入排序的情况下,上面已经分析了,每次外层循环元素定下来的时候,该元素的左侧的所有元素就已经是排好序的,所以可以通过两个相邻元素的交换到达指定点,举个例子:
array = {1, 6, 8, 3};元素3需要插入到元素1和元素6之间,那么过程是这样的:
3和8对比,3<8于是3和8交换位置,此时array = {1, 6, 3, 8};
3和6对比,3<6于是3和6交换位置,此时array = {1, 3, 6, 8};
3和1对比,3>1,所以结束。

好了,瞎掰扯了那么多,看看最终代码(Java实现),重点体会内层循环

import cn.hutool.core.util.ArrayUtil;
import java.util.Arrays;

/**
 * @author NOknow
 * @version 1.0
 * @date 2020/09/08
 */
public class InsertSort {

  @SuppressWarnings({"all"})
  public static void sortAsc(Comparable[] data) {
    for (int i = 1; i < data.length; i++) {
      for (int j = i; j > 0 && data[j].compareTo(data[j - 1]) < 0; j--) {
        ArrayUtil.swap(data, j, j - 1);
      }
    }
  }

  public static void main(String[] args) {
    Integer[] integers = {16, 33, 20, 5, 39, 7, 20, 9, 10, 31};
    System.out.println(Arrays.toString(integers));
    sortAsc(integers);
    System.out.println(Arrays.toString(integers));
  }
}

控制台输出:

[16, 33, 20, 5, 39, 7, 20, 9, 10, 31]
[5, 7, 9, 10, 16, 20, 20, 31, 33, 39]

ArrayUtil.swap为hutool提供的静态方法,,感兴趣的可以看看hutool官网:https://hutool.cn/docs/#/core/工具类/数组工具-ArrayUtil

可进入这个宝藏地址进行可视化演示:https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值