• 数据结构与算法之美09(排序)


    最经典的、最常用的:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。

    排序算法的执行效率

    对于排序算法执行效率的分析,我们一般会从这几个方面来衡量:

    1.最好情况、最坏情况、平均情况时间复杂度

    2.时间复杂度的系数、常数 、低阶

    3.比较次数和交换(或移动)次数

    排序算法的稳定性

    针对排序算法,我们还有一个重要的度量指标,稳定性。这个概念是说,如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。

    冒泡排序算法

    1. // 冒泡排序,a表示数组,n表示数组大小
    2. public void bubbleSort(int[] a, int n) {
    3. if (n <= 1) return;
    4. for (int i = 0; i < n; ++i) {
    5. // 提前退出冒泡循环的标志位
    6. boolean flag = false;
    7. for (int j = 0; j < n - i - 1; ++j) {
    8. if (a[j] > a[j+1]) { // 交换
    9. int tmp = a[j];
    10. a[j] = a[j+1];
    11. a[j+1] = tmp;
    12. flag = true; // 表示有数据交换
    13. }
    14. }
    15. if (!flag) break; // 没有数据交换,提前退出
    16. }
    17. }

    通过“有序度”和“逆序度”这两个概念来进行分析。

    有序度是数组中具有有序关系的元素对的个数。有序元素对用数学表达式表示就是这样:

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

     

    同理,对于一个倒序排列的数组,比如6,5,4,3,2,1,有序度是0;对于一个完全有序的数组,比如1,2,3,4,5,6,有序度就是n*(n-1)/2,也就是15。我们把这种完全有序的数组的有序度叫作满有序度

    逆序度的定义正好跟有序度相反(默认从小到大为有序)

    逆序度=满有序度-有序度

    插入排序

    1. // 插入排序,a表示数组,n表示数组大小
    2. public void insertionSort(int[] a, int n) {
    3. if (n <= 1) return;
    4. for (int i = 1; i < n; ++i) {
    5. int value = a[i];
    6. int j = i - 1;
    7. // 查找插入的位置
    8. for (; j >= 0; --j) {
    9. if (a[j] > value) {
    10. a[j+1] = a[j]; // 数据移动
    11. } else {
    12. break;
    13. }
    14. }
    15. a[j+1] = value; // 插入数据
    16. }
    17. }

  • 相关阅读:
    设计模式总结
    python异常处理
    ESP8266-Arduino编程实例-TEA5767收音机模块驱动
    阿里云OSS图片存储
    mac使用n切换node版本
    基于springboot+vue的西藏特产销售购物商城系统 elementui
    抽取泛微和建云的销售合同定时任务(要求记录翻译不成功的字段)
    20230904工作心得:集合应该如何优雅判空?
    【EMC专题】电磁兼容学科的发展
    7种链游媒体宣发工具助力游戏营销-华媒舍
  • 原文地址:https://blog.csdn.net/m0_63263973/article/details/126673151