日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

排序(四)交换排序

發布時間:2024/4/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序(四)交换排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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;}}

    ?

    ?

    算法分析:

  • 在最好的情況下,快速排序只需要大約nlgn次比較操作,在最壞的情況下需要大約1/2 n2?次比較操作。
  • 在最好的情況下,每次的劃分都會恰好從中間將序列劃分開來,那么只需要lgn次劃分即可劃分完成,每一次劃分都需要比較N次。
  • 在最壞的情況下,即序列已經排好序的情況下,每次劃分都恰好把數組劃分成了0,n兩部分,那么需要n次劃分,但是比較的次數則變成了n, n-1, n-2,….1, 所以整個比較次數約 為 nnndf n(n-1)/2~n2/2.
  • 平均情況下,快速排序需要大約1.39NlgN次比較,這比合并排序多了39%的比較,但是由于涉及了較少的數據交換和移動操作,他要比合并排序更快。
  • 快速排序是非穩定性排序。
  • ?

    轉載于:https://www.cnblogs.com/shihaochangeworld/p/5572813.html

    總結

    以上是生活随笔為你收集整理的排序(四)交换排序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。