07_排序之冒泡、插入、选择

1.如何分析一个排序算法?

排序算法的执行效率

  • 最好情况、最坏情况、平均情况时间复杂度
  • 时间复杂度的系数、常数 、低阶
  • 比较次数和交换(或移动)次数

排序算法的内存消耗
也就是空间复杂度,特别的,空间复杂度为O(1)的排序算法也叫原地排序算法
排序算法的稳定性
如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。

2.冒泡排序

算法代码

public static void sort(int[] array, int n){
    for (int i = n - 1;i > 0;i--) {
        boolean isChange = false;
        for (int j = n - 1; j > n - i - 1; j--) {
            if (array[j] < array[j - 1]) {
                int tmp = array[j - 1];
                array[j - 1] = array[j];
                array[j] = tmp;
                isChange = true;
            }
        }
        if (!isChange) break;
    }
}

分析:
冒泡排序是原地排序算法,只用了常量级的空间
冒泡排序是稳定的排序算法
时间复杂度:最好O(n) 最坏O(n2) 平均怎么算?

有序度和逆序度
概念:
有序度

有序元素对:a[i] <= a[j], 如果i < j

逆序度

逆序元素对:a[i] > a[j], 如果i < j

满有序度为n*(n-1)/2
逆序度 = 满有序度 - 有序度
由于每交换一次,有序度就加1,交换次数就和逆序度相对应
最坏情况下,初始有序度为0,要进行n*(n-1)/2次交换;最坏情况下,初始有序度为n*(n-1)/2,不需要交换,我们取个中间值n*(n-1)/4
也就是说,平均情况下,需要n*(n-1)/4次交换操作,比较操作肯定更多,而复杂度上限为O(n2),故平均时间复杂度就是O(n2)

3.插入排序

// 插入排序,a表示数组,n表示数组大小
public void insertionSort(int[] a, int n) {
  if (n <= 1) return;

  for (int i = 1; i < n; ++i) {
    int value = a[i];
    int j = i - 1;
    // 查找插入的位置
    for (; j >= 0; --j) {
      if (a[j] > value) {
        a[j+1] = a[j];  // 数据移动
      } else {
        break;
      }
    }
    a[j+1] = value; // 插入数据
  }
}

分析:
插入排序是原地算法
插入排序是稳定算法
时间复杂度分析 最好O(n) 最坏O(n2)
平均时间复杂度 数组中插入一个数据的平均时间复杂度为O(n),对插入排序来说,每次插入都相当于在数组中插入一个数据,执行n次操作,故平均时间复杂度为O(n2)

4.选择排序

public static void selectSort(int[] array, int n) {
    for (int i = 0; i < n - 1; i++) {
        int min = i; //min记录最小值的下标
        //从i+1开始,搜索最小值下标
        for (int j = i + 1; j < n; j++)
            if (array[j] < array[min]) min = j;
        //交换
        if (i != min){
            int tmp = array[i];
            array[i] = array[min];
            array[min] = tmp;
        }
    }
}

选择排序是原地排序算法
选择排序是不稳定算法
最好时间复杂度O(n) 最坏时间复杂度O(n2) 平均时间复杂度O(n2)

5.为什么插入比冒泡更受欢迎?

冒泡排序的数据交换要比插入排序的数据移动要复杂,冒泡排序需要 3 个赋值操作,而插入排序只需要 1 个
我们把执行一个赋值语句的时间粗略地计为单位时间(unit_time),然后分别用冒泡排序和插入排序对同一个逆序度是 K 的数组进行排序。用冒泡排序,需要 K 次交换操作,每次需要 3 个赋值语句,所以交换操作总耗时就是 3*K 单位时间。而插入排序中数据移动操作只需要 K 个单位时间。

冒泡排序中数据的交换操作:
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;
}

参考课程:极客时间王争老师的《数据结构与算法之美》

数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值