数据结构与算法之四(基础篇)

本文详细介绍了排序算法的基础篇,包括冒泡排序、插入排序、选择排序、归并排序、快速排序、桶排序、计数排序和基数排序。冒泡排序和插入排序的时间复杂度平均为O(n^2),而归并排序和快速排序平均时间复杂度为O(nlogn),其中快速排序更节省内存。桶排序和计数排序在特定条件下能达到线性时间复杂度O(n)。
摘要由CSDN通过智能技术生成

排序

排序算法有很多,其中最常用的有冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。
算法的内存消耗可以通过空间复杂度来衡量,原地排序算法特指空间复杂度O(1)的排序算法,排序算法的稳定性是指待排序的序列中存在值相等的元素,经过排序之后,相等元素的先后顺序不变。

冒泡排序(Bubble Sort)

冒泡排序只会操作相邻两个元素的数据,每次冒泡操作都会比较相邻元素大小,如果不满足条件则互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 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;  // 没有数据交换,提前退出
  }
}

冒泡排序只涉及相邻元素的交换,只需要常量级的临时空间,时间复杂度O(1),是原地排序算法。在冒泡排序中,只有交换才可以改变两个元素的前后顺序。为了保证冒泡排序算法的稳定性,当有相邻的两个元素大小相等的时候,我们不做交换,相同大小的数据在排序前后不会改变顺序,所以冒泡排序是稳定的排序算法。最好时间复杂度是数据有序时,只需要进行一次冒泡操作就可以结束了,最好时间复杂度为O(n)。最坏时间复杂度是要排序的元素是倒序,要进行n次冒泡,最坏时间复杂度为O(n^2)。
如果用概率论方法定量分析平均时间复杂度,涉及的数学推理和计算就会很复杂。可以通过有序度和逆序度来分析。有序度是数组中具有有序关系的元素对的个数。比如2,4,5有序对为(2,4),(2,5),(4,5),有序度为3。对于一个倒序排列的数组,比如 6,5,4,3,2,1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值