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

Posted 米琪儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典排序算法学习笔记之一——冒泡排序相关的知识,希望对你有一定的参考价值。

冒泡排序

数据结构 数组
最差时间复杂度 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;
                     }
       }
}

 

以上是关于经典排序算法学习笔记之一——冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

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

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

经典算法学习——冒泡排序

经典算法学习——链表实现冒泡排序

十大经典排序算法总结(冒泡排序)

经典算法学习——非循环双向链表实现冒泡排序(不带头结点)