C++11写算法之冒泡排序
冒泡排序很形象,指从数组后面将更小的值慢慢浮到前面去,每遍历一趟使得最小值浮到最前面(指当前位置)。
这里有点小技巧,当某一次遍历过程中发现无交换,则说明此时数组已经排序完成,可提前退出。
时间复杂度:O(n^2)
空间复杂度:O(1)
此处应用了C++11的auto , lambda , static_assert 。
show me the code !
// #if __cplusplus < 201103L // #error "must be compiled under c++11 support platform!!!" // #endif #include <iostream> #include <algorithm> #include <iterator> #include <cassert> using namespace std; void Swap(int& a, int& b) { int tmp = a; a = b; b = tmp; } void BubbleSort(int varList[], const int size) { if (!varList || size <= 1) { return; } bool sortedOK = false; for (int i = 0; i < size && !sortedOK; i++) { sortedOK = true; for (int j = size - 1; j >= i;j--) { if (varList[j-1] > varList[j]) { Swap(varList[j - 1], varList[j]); sortedOK = false; } } } } void test() { //case counter int testCase = 0; //sort function object auto sortFunc = BubbleSort; //show case result lambda function auto showFunc = [&testCase](const char* caseDescription){cout << "case[" << testCase++ << "]\t(" << caseDescription << ") \t\tok " << endl; }; cout << "test begin : " << endl << endl; //case empty list { sortFunc(nullptr, 0); showFunc("case empty list"); } //case wrong size { int nTestList[] = { 13, 52, 32, 15, 66, 2, 99, 202, 103, 2 }; sortFunc(nTestList, 0); showFunc("case wrong size"); } //case size == 1 { int var = 13; int varList[] = { var }; sortFunc(varList, 1); assert(var == varList[0]); showFunc("case size == 1"); } //case normal sort { int varList[] = { 13, 52, 32, 15, 66, 2, 99, 202, 103, 2 }; const int size = sizeof(varList) / sizeof(int); const int resultList[] = { 2, 2, 13, 15, 32, 52, 66, 99, 103, 202 }; static_assert(sizeof(varList) == sizeof(resultList),"size of varList is not equal with resultList!!"); sortFunc(varList, size); for (int i = 0; i < size; i++){ assert(varList[i] == resultList[i]); } showFunc("case normal sort"); } //case sorted list { int varList[] = { 2, 2, 13, 15, 32, 52, 66, 99, 103, 202 }; const int size = sizeof(varList) / sizeof(int); const int resultList[] = { 2, 2, 13, 15, 32, 52, 66, 99, 103, 202 }; static_assert(sizeof(varList) == sizeof(resultList), "size of varList is not equal with resultList!!"); sortFunc(varList, size); for (int i = 0; i < size; i++){ assert(varList[i] == resultList[i]); } showFunc("case sorted list"); } cout << endl << "test done ! " << endl << endl; } int main(int argc, char* argv[]) { test(); return 0; }