java排序算法之插入排序

- 日理万妓 2023-10-18 14:21 197阅读 0赞

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

插入排序的大体执行步骤如下:

  • 从第一个元素开始,该元素可以认为已经被排序;
  • 取出下一个元素,在已经排序的元素序列中从后向前扫描
  • 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  • 将新元素插入到该位置后,重复步骤2~5。

有这样一个生活实例大家可以用于联想一下,我们类比一下打扑克,我们拿到牌之后,摸来的第1张牌无须整理,此后每次从桌上的牌(无序区)中摸最上面的1张并插入左手的牌(有序区)中正确的位置上。为了找到这个正确的位置,须自左向右(或自右向左)将摸来的牌与左手中已有的牌逐一比较。

在这里插入图片描述

图解:根据其原理,我们把该无序数列看成两个部分,我们不难看出图中,首先我们把第一位3看成是有序数列,剩下的作为无序数列,因为要把后面的无序数列中的数插入到前面有序数列,所以依次把后面的数抽出,在前面找到合适位置插入。如图,先抽出44,与前面比较,比3大放在3后面,再抽出38,与前面比较,比44小,比3大,所以插入到3后面。依次类推,直到最后的一个数也插入到前面的有序数列中,最终的排序效果图如下,

在这里插入图片描述
搞清楚了排序的执行过程,下面我们开始编写代码,代码比较简单,直接贴出来供大家参考,

  1. public class InsertSort {
  2. public static void main(String[] args) {
  3. int[] arr = {11,18,43,32};
  4. System.out.println("排序前:" + Arrays.toString(arr) + "\r");
  5. System.out.println("排序后:" + Arrays.toString(sortInsert(arr)));
  6. }
  7. //插入排序方法
  8. public static int[] sortInsert(int[] arr){
  9. int current; //定义待排序的元素
  10. for(int i=0;i<arr.length-1;i++){
  11. current = arr[i+1];
  12. int preindex = i; //待排序元素的前一个元素
  13. //通过此循环,肯定可以定位待排序元素的位置,同时将对应的已经排好序的元素位置右移
  14. while(preindex >= 0 && current <arr[preindex]){
  15. arr[preindex+1]=arr[preindex]; //待排序元素依次和前面的元素进行比较
  16. preindex--;
  17. }
  18. arr[preindex+1] = current;
  19. }
  20. return arr;
  21. }
  22. }

运行main函数,可以看到可以正确得到我们预期的效果,
在这里插入图片描述
简单分析一下插入排序的性能,可得出如下结论:

最好的情况:T(n) = O(n),即有序数组,但这种情况极特殊;
最差情况:T(n) = O(n2);
平均来看:T(n) = O(n2)

发表评论

表情:
评论列表 (有 0 条评论,197人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java排序算法插入排序

    插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入

    相关 排序算法插入排序

    \[插入排序-普通插入排序\] 1.算法思想 将元素a视为基序列,遍历数组将元素a右边的元素依次插入序列中,找到比自己小的数置于其后,保证序列一直处于已排序的状态

    相关 排序算法插入排序

    插入排序> 对于排序相信大家都不陌生,就是将一组数据按照从大到小(降序)或者是从小到大(升序)进行排列,那仫常见的排序算法有哪些呢?我总结了以下几种常见的排序算法,在本篇文

    相关 Java排序算法插入排序

           最近接触了插入排序算法,查了一些资料,写一些自己的理解吧。这种排序方式感觉有些像选择排序法,选择排序法是将当前元素与之后的所有元素逐一比较,从而找出最大或最小值,

    相关 排序算法插入排序

    插入排序类似于打扑克,取出未排序的一张牌插入到已排序的牌中,取出的一张牌是在已排序好的牌中从后向前查找,直到查找到比当前牌小的那个位置,然后插入进去 示例代码: \[9, 1