首页 > 代码库 > 经典排序算法学习笔记之一——冒泡排序

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

一、冒泡排序

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 = truewhile 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;                     }       }}

 

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