美文网首页
day09-冒泡排序+优化

day09-冒泡排序+优化

作者: Summer2077 | 来源:发表于2020-07-19 21:20 被阅读0次

排序算法(SortAlgorithm)

image.png

算法时间复杂度总结:

排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性
冒泡排序 O(n^2) O(n^2) O(n) O(1) 稳定
选择排序 O(n^2) O(n^2) O(n^2) O(1) 不稳定
插入排序 O(n^2) O(n^2) O(n) O(1) 不稳定
希尔排序 O(n^1.3) O(n^2) O(n) O(1) 不稳定
快速排序 O(nlog_2n) O(n^2) O(nlog_2n) O(nlog_2n) 不稳定
堆排序 O(nlog_2n) O(nlog_2n) O(nlog_2n) O(1) 不稳定
归并排序 O(nlog_2n) O(nlog_2n) O(nlog_2n) O(n) 稳定
基数排序 O(n*k) O(n*k) O(n*k) O(n+k) 稳定

概念:时间频度 和 时间复杂度

时间频度

时间频度T(n):一个算法中的语句执行次数称为语句的频度或时间频度。

时间复杂度

时间复杂度 f(n):T(n) = o(F(n))
时间复杂度表示的是一个数量级,并不是一个具体的值。

时间频度估算时间复杂度规则:

  • 忽略常数项。
  • 忽略低次项。
  • 忽略系数。
T(n) = 2n^2+3n+3
忽略常数项
T(n) = 2n^2+3n
忽略低次项
T(n) = 2n^2
忽略系数
T(n) = n^2 = f(n)

即T(n) = 2n^2 + 3n + 3的时间复杂度为n^2的级别的。

tips:for循环会因为最后一次判断而多一次执行。

常见的时间复杂度:

image.png
  1. 常数阶:O(1)
  2. 对数阶:O(log2n)
  3. 线性阶:O(n)
  4. 线性对数阶:O(nlog2n)
  5. 平方阶:O(n^2)
  6. 立方阶:O(n^3)
  7. K次方阶:O(n^k)
  8. 指数阶:O(2^n)

一定要避免指数阶的算法!!!!!

冒泡排序

  • 基本思想:两个数比较大小,较大的数下沉,较小的数冒起来。

原理:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  3. 针对所有的元素重复以上的步骤,除了最后一个。

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

通过观察冒泡排序的过程我发现如下结论:

  1. 只要遍历 array.length-1 次
  2. 每次遍历的数量在减少 第n趟只要交换到第array.length-1-n 个元素
  3. 本次遍历没有发生过交换就说明顺序已经正确。(优化)

bubbleSort

 public static void bubbleSort(int[] array){
       int temp = 0;
       Long count = 0L;
       for (int i = 0; i < array.length-1; i++) {//
           for (int j = 0; j < array.length -1 - i; j++) {
               count++;
               if (array[j]>array[j+1]){
                   flage=true;
                   temp = array[j];
                   array[j] = array[j+1];
                   array[j+1] = temp;
               }
           }
           if (!flage){
               break;
           }else {
               flage = false;
           }
       }
       System.out.println("count(执行次数)"+count);
   }
}

bubbleSort(优化)

本次遍历没有发生过交换就说明顺序已经正确。做一下判断跳出循环即可。

 public static void bubbleSort(int[] array){
       int temp = 0;
       boolean flage = false;
       Long count = 0L;
       for (int i = 0; i < array.length-1; i++) {//
           for (int j = 0; j < array.length -1 - i; j++) {
               count++;
               if (array[j]>array[j+1]){
                   flage=true;
                   temp = array[j];
                   array[j] = array[j+1];
                   array[j+1] = temp;
               }
           }
           if (!flage){
               break;
           }else {
               flage = false;
           }
       }
       System.out.println("count(执行次数)"+count);
   }
}

完整测试代码:

public class BubbleSort {

    public static void main(String[] args) {
        int arr[] = new int[80000];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int)(Math.random()*80000);
        }
        bubbleSort(arr);
    }

    public static void bubbleSort(int[] array){
        int temp = 0;
        boolean flage = false;
        Long count = 0L;
        for (int i = 0; i < array.length-1; i++) {//
            for (int j = 0; j < array.length -1 - i; j++) {
                count++;
                if (array[j]>array[j+1]){
                    flage=true;
                    temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                }
            }
            if (!flage){
                break;
            }else {
                flage = false;
            }
        }
        System.out.println("count(执行次数)"+count);
    }
}

相关文章

  • day09-冒泡排序+优化

    排序算法(SortAlgorithm) 算法时间复杂度总结: 排序方法时间复杂度(平均)时间复杂度(最坏)时间复杂...

  • 冒泡排序的C语言实现

    冒泡排序 优化后的冒泡排序

  • 经典排序算法总结

    经典排序算法集锦 冒泡法 排序算法入门之冒泡排序 排序算法入门之冒泡排序优化

  • 冒泡排序(ios和前端script)

    ios之冒泡排序 未优化之前 优化之后 前端冒泡排序(与上同理) 方式一: 方式二:

  • 排序算法-swift实现

    1.冒泡排序 时间复杂度:O(n^2) 1.1初级 1.2正宗冒泡排序 1.3冒泡排序优化 问题:排序过程中,如果...

  • 排序算法-2(javascript) 快速排序的实现

    快速排序 快速排序是冒泡排序的优化,与冒泡排序不同的是,使用了分治法,进行优化。会随机选取一个值pivot(基准元...

  • Python之算法LOB三人组

    一、冒泡排序 a、冒泡排序----优化 如果冒泡排序中执行一趟而没有交换,则列表已经是有序状态,可以...

  • 双线程冒泡排序算法

    双线程冒泡排序算法是对冒泡排序的优化,对冒泡排序加入了另外一个线程。 冒泡排序可以从数组的第0个元素开始排列,同样...

  • 从0开始——排序

    0.排序的复杂度比较 1.冒泡排序 冒泡排序基础版本1 正宗冒泡排序优化版本 2.选择排序 3.插入排序算法 4....

  • 《大话数据结构》笔记二(排序)

    1 冒泡排序(优化)2 选择排序3 直接插入排序4 希尔排序5 堆排序6 归并排序(优化)7 快速排序(优化) 1...

网友评论

      本文标题:day09-冒泡排序+优化

      本文链接:https://www.haomeiwen.com/subject/qnirkktx.html