排序:Java实现插入排序原理及代码注释详解
  TEZNKK3IfmPf 2023年11月12日 16 0

插入排序

1.简介:

插入排序是一种简单直观且稳定的排序算法。它的最坏时间复杂度为O(n2),最好时间复杂度为O(n),平均时间复杂度为O(n2),它是稳定排序。

基本思想:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。

2.算法原理:

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

结合动态图理解一下:
排序:Java实现插入排序原理及代码注释详解
(图片来源:十大经典排序算法(动图演示))

3.代码实现:

    public static void  chaRu(int[] arr) {
     
       
        // 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
        for (int i = 1; i < arr.length; i++) {
     
       
            // 记录要插入的数据
            int tmp = arr[i],j;
            // 从已经排序的序列最右边的开始比较,找到比其小的数
            for(j = i;j > 0 && arr[j-1] > tmp;j--)
                arr[j] = arr[j-1];
            // 存在比其小的数,插入
            arr[j] = tmp;
        }
    }

测试一波:

package sort;
/** * @author yzh * @date 2019-07-17 2:02 */
public class ChaRu {
     
       
    public static void  chaRu(int[] arr) {
     
       
        // 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
        for (int i = 1; i < arr.length; i++) {
     
       
            // 记录要插入的数据
            int tmp = arr[i],j;
            // 从已经排序的序列最右边的开始比较,找到比其小的数
            for(j = i;j > 0 && arr[j-1] > tmp;j--)
                arr[j] = arr[j-1];
            // 存在比其小的数,插入
            arr[j] = tmp;
        }
    }
    public static void main(String[] args) {
     
       
        int[] arr = {
     
       24,-4,754,76,24};
        chaRu(arr);
        for(int i = 0;i < arr.length;i++){
     
       
            System.out.println(arr[i]);
        }
    }
}

测试结果:
排序:Java实现插入排序原理及代码注释详解
4.优缺点:

  • 优点:稳定,快;
  • 缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   21天前   48   0   0 java
  TEZNKK3IfmPf   2024年05月31日   55   0   0 java
TEZNKK3IfmPf