为什么插入排序比冒泡排序更受欢迎?(小规模数据量排序算法:冒泡、插入、选择)

本文探讨了插入排序与冒泡排序的效率差异,指出在时间复杂度相同的情况下,插入排序由于较少的数据移动次数而在大规模数据排序中表现更优。插入排序可能进行0到n-1次插入,而冒泡排序的交换操作相对较多。尽管两者都是O(n^2),但插入排序在实际应用中通常更受欢迎。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >





常见8种排序算法

排序算法时间复杂度基于比较
冒泡排序、插入排序、选择排序O(n^2)
快速排序、归并排序O(nlogn)
桶排序、计数排序、基数排序O(n)

排序算法的执行效率 考虑方向

  1. 最坏时间复杂度、最好时间复杂度、平均时间复杂度
    两个相同最坏时间复杂度的,可能最好时间复杂度不一致,导致性能有所偏差。
  2. 时间复杂度的系数、常数 、低阶
    在较少的数据排序下,系数的大小、常数等会对排序效率有较大影响,反之如果是一万、一百万、一亿,影响甚至会忽略不计。
    在这里插入图片描述
  3. 比较次数和移动次数
    选出2个所有参考(除了比较次数和移动次数)都相同的排序算法,这个参数在数量越大的情况下,会有巨大的效率差距。

(排序)稳定性

如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。

冒泡排序

冒泡排序主要就是交换,相邻的两个元素进行交换。
一次冒泡需要交换 n-1次
在这里插入图片描述
需要进行 n 次冒泡
在这里插入图片描述
当判断没有数据交换时,可以减少冒泡次数。

// 冒泡排序,a 表示数组,n 表示数组大小
public void bubbleSort(int[] a, int n) {
 if (n <= 1) return;
 for (int i = 0; i < n; ++i) {
 // 提前退出冒泡循环的标志位
 boolean flag = false;
 for (int j = 0; j < n - i - 1; ++j) {
 if (a[j] > a[j+1]) { // 交换
 int tmp = a[j];
 a[j] = a[j+1];
 a[j+1] = tmp;
 flag = true; // 表示有数据交换
 }
 }
 if (!flag) break; // 没有数据交换,提前退出
 }
}

插入排序

有可能进行0到n-1次插入操作
在这里插入图片描述

 	//4,2,6,7,3,2
    //2,4,6,7,3,2
    /**
     * 2,4,6,,7,2
     * 2,4,,6,7,2
     * 2,,4,6,7,2
     */
    //2,3,4,6,7,2
    //2,2,3,4,6,7

    public static void chaRu(int[] arr){
        if (arr.length==1)return;

        //首先保证进行N次插入,(每一次:比较后,有可能不进行插入,移动等操作。)
        for (int i = 0; i < arr.length; i++) {
            //保留每次可能进行插入操作的对象
            int value = arr[i];
            //并且将最大可能移动操作定为 i-1(比如第3位上,前面的1和2可有往后平移2次。)
            int j = i-1;
            for (; j >= 0; j--) {
                //当第j位上的数 大于 i位时。
                if (arr[j]>value){
                    //数据向后移一位
                    arr[j+1] = arr[j];
                }else {
                    //为了稳定性 当出现小于等于时,跳出。并决定了 向后移动(0-j)位。
                    break;
                }
            }
            //在第j+1位进行插入操作
            arr[j+1] = value;
        }
    }

选择排序

在这里插入图片描述

    /**
     * 4,2,6,7,3,2
     * 选择排序
     */
    public static void select(int[] arr){
        if (arr.length==1)return;

        for (int i = 0; i < arr.length-1; i++) {
            int t = i;
            for (int j = i+1; j < arr.length; j++) {
                if (arr[j]<arr[t]){
                    t = j;
                }
            }
            int temp = arr[i];
            arr[i] = arr[t];
            arr[t] = temp;
            System.out.println(Arrays.toString(arr));
        }
    }

为什么插入排序比冒泡排序更受欢迎?

时间复杂度都为O(n^2),冒泡排序不管怎么优化,元素交换的次数是一个固定值,是原始数据的逆序度。插入排序是同样的,不管怎么优化,元素移动的次数也等于原始数据的逆序度。

冒泡排序中数据的交换操作:
if (a[j] > a[j+1]) { // 交换
 	int tmp = a[j];
 	a[j] = a[j+1];
 	a[j+1] = tmp;
 	flag = true;
}
插入排序中数据的移动操作:
if (a[j] > value) {
 	a[j+1] = a[j]; // 数据移动
} else {
 	break;
}

但是 冒泡排序 数据赋值了3次 插入只进行了1次。

在数据量越大的排序下,会越明显,即使数量少,插入排序也占优势。






如有错误欢迎指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值