技术交流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)
- 稳定性:稳定