Fork me on GitHub

3.1.2蛮力法之冒泡排序

        冒泡排序比较表中的相邻元素,如果它们是逆序的话,就交换它们的位置。重复多次以后,最终,最大的元素就“沉到”列表的最后一个位置。第二遍操作将第二大的元素沉下去。这样一直做,直到n-1遍以后,该列表就排好序了。第i(0<=i<=n-2)遍冒泡排序可以用下面的示意图来表示:

                                      

该算法的伪代码:

BubbleSort(A[0...n-1])
//该算法用冒泡排序对数组A[0...n-1]进行排序
//输入:一个可排序数组A[0...n-1]
//输出:非降序排列的数组A[0...n-1]
for i←0 to n-2 do
    for j←0 to n-2-i do
        if A[j+1]<A[j]    swap A[j] and A[j+1]

        对于所有规模为n的数组来说,该冒泡排序版本的键值比较次数都是相同的。

           

        但它的键交换次数取决于特定的输入。最坏的情况就是遇到降序排列的数组,这时,键交换次数和键比较次数是相同的。

             

 

        改进:如果对列表比较一遍之后没有交换元素的位置,那么这个表已经有序,我们可以停止这个算法了。

        它的效率着实低。实际上,即使在初等排序方法当中,冒泡排序也不是一个好的选择。

 

C++代码:

#include<iostream>
using namespace std;

void BubbleSort(int a[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            if (a[j+1] < a[j])
                swap(a[j], a[j+1]);
        }
    }
}
int main()
{
    int a[] = {89, 45, 68, 90, 29, 34, 17};
    BubbleSort(a, sizeof(a) / sizeof(a[0]));
    for (int k = 0; k < sizeof(a) / sizeof(a[0]); k++) {
        cout << a[k] << " ";
    }
    cout << endl;
    return 0;
}

 

posted @ 2017-10-16 23:02  realswx  阅读(533)  评论(0编辑  收藏  举报