技术交流QQ群:1027579432,欢迎你的加入!

一、冒泡排序算法个人理解

  • 主要是以两个形成嵌套的for循环来完成的。外层的for循环以索引ix的值来逐个访问序列中的每个元素,ix的值由0开始增加到size(sequence) - 1,当外部的for循环迭代完成后,由ix索引取出的元素已经被放在正确的位置上了。放元素的操作是由内层的for循环来实现的,内层for循环的索引的值jx从ix+1依次递增到size(sequence) - 1为止,它比较位于ix和jx上的两个元素,如果jx上的元素较小,就将两个元素互换。具体排序过程见下图:


    冒泡排序.jpg

二、冒泡排序算法代码实现(C++版本)

#include "iostream"

using namespace std;

void bubleSort(int * a, int n);


int main(){
    int ix;
    int a[] = {8, 34, 3, 13, 1, 21, 5, 2};
    int a_length = (sizeof(a)) / (sizeof(a[0]));
    cout << "冒泡排序前:";
    for (int ix = 0; ix < a_length; ix++)
        cout << a[ix] << " ";
    cout << endl;

    bubleSort(a, a_length);

    cout << "冒泡排序后:";
    for (int ix = 0; ix < a_length; ix++)
        cout << a[ix] << " ";
    cout << endl;

    return 0;
}

void bubleSort(int * a, int n){   // int * a;定义一个数组指针,方便从主函数传入一个变化长度的数组
    int ix, jx, temp;
    for (int ix=0; ix < n; ix++){
        for (jx=ix+1; jx < n; jx++){
            if (a[jx] < a[ix]){
                temp = a[jx];
                a[jx] = a[ix];
                a[ix] = temp;
            }
        }
    }
}
  • STL实现
#include <iostream>
#include <vector>
#include <algorithm>


using namespace std;



// 打印元素
void PrintV(vector<int>& v){
    for(auto &e: v){
        cout << e << ' ';
    }
    cout << endl;
}


// 冒泡排序基本版本
void BubbleSort(vector<int>& v){
    int n = v.size();
    for(int i=0; i < n-1; ++i){
        for(int j=0; j < n-1-i; ++j){
            if(v[j] > v[j+1]){
                swap(v[j], v[j+1]);
            }
        }
    }
}

// 函数模板来实现
template<typename T>   // 模板头
void BubbleSort1(T arr[], int len){
    for(int i=0; i < len-1; ++i){
        for(int j=0; j < len-1-i; ++j){
            if(arr[j] > arr[j+1]){
                swap(arr[j], arr[j+1]);
            }
        }
    }
}



// 冒泡排序优化版本
void BubbleSort2(vector<int>& v){
    int n = v.size();
    bool flag = false;  // flag标志:表示序列是否有序
    for(int i=0; i < n-1 && !flag; ++i){
        flag = true;
        for(int j=0; j < n-1-i; ++j){
            if(v[j] > v[j+1]){
                flag = false;  // 发生交换则仍非有序
                swap(v[j], v[j+1]);
            }
        }
    }
}



// 自己实现两个数的交换
void Swap(int& a, int& b){
    int temp;
    temp = a;
    a = b;
    b = temp;
}


int main(){
    vector<int> v{7, 30, 16, 4, 1, 2, 9};
    cout << "冒泡排序前: ";
    PrintV(v);
    BubbleSort2(v);
    cout << "冒泡排序后: ";
    PrintV(v);
    return 0;
}

三、结果

结果.png

四、冒泡排序时间复杂度总结:

  • 平均时间复杂度:O(n**2)
  • 最好情况:O(n)
  • 最坏情况:O(n**2)
  • 空间复杂度:O(1)
  • 稳定性:稳定