zoukankan      html  css  js  c++  java
  • 排序算法之冒泡排序

    冒泡排序:通过n-1轮外层循环,每第 i 轮外层循环都会有一个n-1-i轮内层循环,且每一轮内层循环将无序序列的最大或最小的一个数,需要通过两两对比、交换的方式(可能存在多次位置交换)逐渐冒泡移动、增加到有序序列中。直到无序序列只剩最后一个最大或最小的数,默认进入有序序列,排序结束。

     1 //冒泡排序
     2 
     3 const NumberArr = [2, 2, 1, 6, 52, 4, 5, 8, 9, 17, 3];
     4 
     5 /**
     6  * 升幂排序,进行n-1次排序,第n轮因为前面n-1个元素都排好序,只剩一个元素不需要比较排序
     7  * 每一轮比较元素,不需要比较已经排序好的元素。所以减掉了很多重复排序
     8  * @param {*} arr 未排序的数组
     9  * @returns arr 已经排序好的数组
    10  */
    11 function buddle_arr_asc(arr) {
    12     for (let i = 0; i < arr.length - 1; i++) {
    13         for (let j = 0; j < arr.length - (i + 1); j++) {
    14             if (arr[j] > arr[j + 1]) {
    15                 let temp = arr[j];
    16                 arr[j] = arr[j + 1];
    17                 arr[j + 1] = temp;
    18             }
    19         }
    20     }
    21     return arr;
    22 }
    23 
    24 
    25 /**
    26  * 降幂排序,进行n-1次排序,第n轮因为前面n-1个元素都排好序,只剩一个元素不需要比较排序
    27  * 每一轮比较元素,不需要比较已经排序好的元素。所以减掉了很多重复排序
    28  * @param {*} arr 未排序的数组
    29  * @returns arr 已经排序好的数组
    30  */
    31 function buddle_arr_desc(arr) {
    32     for (let i = 0; i < arr.length - 1; i++) {
    33         for (let j = 0; j < arr.length - (i + 1); j++) {
    34             if (arr[j] < arr[j + 1]) {
    35                 let temp = arr[j];
    36                 arr[j] = arr[j + 1];
    37                 arr[j + 1] = temp;
    38             }
    39         }
    40     }
    41     return arr;
    42 }

    最坏情况——逆序:需要进行n(n-1)/2次比较,n-1次排序,n(n-1)/2次记录的移动,时间复杂度为O(n^2)。

    最好情况——正序:需要进行n-1次比较,0次排序,0次移动,时间复杂度为O(n)。

    稳定性:冒泡排序交换的是相邻的两个元素,如果两个元素相等,是不会交换两个元素的位置的,所以冒泡排序是稳定的。

  • 相关阅读:
    python之打开python源文件方法
    python学习网站
    python知识点
    计算机概念--鸭子类型
    装饰器、函数调用 语句分析法
    python相关软件安装
    python之字典的作用
    [转载]理解HTML语义化
    Java 入门 代码2浮点数据类型
    Java入门1dayCode
  • 原文地址:https://www.cnblogs.com/huanqiuxuexiji/p/9163401.html
Copyright © 2011-2022 走看看