• 经典排序算法学习笔记一——冒泡排序


    冒泡排序

    数据结构 数组
    最差时间复杂度 O(n^2)
    最优时间复杂度 O(n)
    平均时间复杂度 O(n^2)
    最差空间复杂度 总共O(n),需要辅助空间O(1)

    https://zh.wikipedia.org/wiki/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F#-.7Bzh-hant:.E8.99.9B.E6.93.AC.E7.A2.BC.3Bzh-hans:.E4.BC.AA.E4.BB.A3.E7.A0.81.7D-

    1、算法思想

    1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
    3. 针对所有的元素重复以上的步骤,除了最后一个。
    4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    2、伪代码

    function bubble_sort (array, length) {
        var i, j;
        for(i from 0 to length-1){
            for(j from 0 to length-1-i){
                if (array[j] > array[j+1])
                    swap(array[j], array[j+1])
            }
        }
    }

    3、实现

    #include <stdio.h>
    void bubble_sort(int arr[], int len) {
        int i, j, temp;
        for (i = 0; i < len - 1; i++)
            for (j = 0; j < len - 1 - i; j++)
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
    }
    int main() {
        int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
        int len = (int) sizeof(arr) / sizeof(*arr);
        bubble_sort(arr, len);
        int i;
        for (i = 0; i < len; i++)
            printf("%d ", arr[i]);
        return 0;
    }

    4、改进

    (1)设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。

    伪代码:参考 http://visualgo.net/sorting

    do
      swapped = false
      for i = 1 to indexOfLastUnsortedElement
        if leftElement > rightElement
          swap(leftElement, rightElement)
          swapped = true
    while swapped

    实现:参考 http://www.cnblogs.com/morewindows/archive/2011/08/06/2129603.html

    void BubbleSort2(int a[], int n)
    {
           int j, k;
           bool flag;
          
           k = n;
           flag = true;
           while (flag)
           {
                  flag = false;
                  for (j = 1; j < k; j++)
                         if (a[j - 1] > a[j])
                         {
                                Swap(a[j - 1], a[j]);
                                flag = true;
                         }
                  k--;
           }
    }

    (2)如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。

    参考:白话经典算法系列之一 冒泡排序的三种实现

    http://www.cnblogs.com/morewindows/archive/2011/08/06/2129603.html

    实现:

    void BubbleSort3(int a[], int n)
    {
           int j, k;
           int flag;
          
           flag = n;
           while (flag > 0)
           {
                  k = flag;
                  flag = 0;
                  for (j = 1; j < k; j++)
                         if (a[j - 1] > a[j])
                         {
                                Swap(a[j - 1], a[j]);
                                flag = j;
                         }
           }
    }
  • 相关阅读:
    Tree的两种存储形式
    滚轮缩放效果
    从hello world 说程序运行机制
    词法分析器的实现
    MSDN中回调函数的讲解及其C#例子:用委托实现回调函数
    在后台new出页面(组件)
    HTML中多种空格转义字符
    ios 博客集合
    IOS学习
    Apple Swift编程语言入门教程
  • 原文地址:https://www.cnblogs.com/crystalmoore/p/5929814.html
Copyright © 2020-2023  润新知