排序(四)交换排序
1.冒泡排序(時間復雜度為 O(N2))
原理是臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,
這樣一趟過去后,最大或最小的數字被交換到了最后一位;重復此動作直到排好序為止;
先來cv一個動圖看看效果:
void BubbleSort(vector<int>& Vector) {for (int i = 0; i < Vector.size(); ++i){for (int j = 0; j < Vector.size() - i - 1; ++j){if (Vector[j] > Vector[j + 1])swap(Vector[j], Vector[j + 1]);}} }/*優化*/ void OptimizeBubbleSort(vector<int>& Vector) {int index = Vector.size() - 1;bool sign = true;while (index && sign){int tmp = -1;for (int i = 0; i < index; ++i){if (Vector[i] > Vector[i + 1]){swap(Vector[i], Vector[i + 1]);tmp = i;}}tmp > 0 ? index = tmp : sign = false;} }
這里奉上一篇關于冒泡排序的博文(超贊):?http://blog.csdn.net/lemon_tree12138/article/details/50591859
?
2.快速排序
快速排序也是一種采用分治法解決問題的一個典型應用。在很多編程語言中,對數組,列表進行的非穩定排序在內部實現中都使用的是快速排序。
借鑒前輩們的動圖看下效果先:
?
快速排序的基本思想如下:
舉個栗子:
?
?
/*方式一:見上圖 ↑↑↑↑↑↑*/int _QuickSort(vector<int>& Vector, int left, int right){int middle = left + (right - left) / 2;/*優化一:三數取中*/ int MaxNumber = Max(Vector[left],Max(Vector[middle], Vector[right]));int MinNumber = Min(Vector[left],Min(Vector[middle], Vector[right]));if (Vector[left] > MinNumber && Vector[left] < MaxNumber)swap(Vector[left], Vector[right]);else if (Vector[middle] > MinNumber && Vector[middle] < MaxNumber)swap(Vector[middle],Vector[right]);int begin = left, end = right - 1;int key = Vector[right];while (begin < end){while (begin < end && Vector[begin] < key)++begin;while (begin < end && Vector[end] >= key)--end;swap(Vector[begin], Vector[end]);}if (Vector[begin] > key){swap(Vector[begin], Vector[right]);return begin;}else{return right;}}/*方式二;挖坑法*/ int _QuickSort(vector<int>& Vector, int left, int right){int begin = left, end = right;int key = Vector[right];while (begin < end){while (begin < end && Vector[begin] < key) ++begin;Vector[end] = Vector[begin];while (begin < end &&Vector[end] >= key) --end;Vector[begin] = Vector[end];}Vector[begin] = key;return begin;}/*方式三:前后指針法*/ int _QuickSort(vector<int>& Vector, int left, int right){int begin = left, small = left - 1, end = right;int key = Vector[right];while (begin < end){if (Vector[begin] < key){++small;swap(Vector[small], Vector[begin]);}++begin;}swap(Vector[++small ], Vector[end]);return small;}
?
void QuickSort(vector<int>& Vector, int left, int right){if (right - left > 13) //優化二:當區間小到一定程度時,使用插入排序{int middle = _QuickSort(Vector, left, right);QuickSort(Vector, left, middle - 1);QuickSort(Vector, middle+1, right);}else{//插入排序 InsertSort(Vector, left, right);}}/*插入排序*/ void InsertSort(vector<int>& Vector, int left, int right){for (int i = left; i<right; ++i){int end = i;int key = Vector[end + 1];while (end >= left && Vector[end] > key){Vector[end + 1] = Vector[end];--end;}Vector[end + 1] = key;}}?
?
算法分析:
?
轉載于:https://www.cnblogs.com/shihaochangeworld/p/5572813.html
總結
- 上一篇: IE haslayout的理解与bug修
- 下一篇: js接受url参数