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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【算法】学习笔记(5):快速排序

發布時間:2023/11/30 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法】学习笔记(5):快速排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

注意一個C++的坑

sizeof()

這個函數靜態數組可以求長度,動態new出來的數組不行,因為針對的是指針……,不過既然的動態數組了,其長度本身必然是一個變量了,你沒有必要這么求長度。

下面看快速排序的代碼。

#include <iostream> #include <algorithm> using namespace std;// divide 比基準點小的放左邊,大的放右邊,返回基準點Index // 對于快速排序,重點是【劃分策略】 // “=”的有無,取決于極端情況,可以使用極端序列快速判定 // 例如 5 4 3 2 1 // 需要關注幾個狀態的特征即可:初態,動態過程中的臨界,終態 int partition_array(int data[], int min,int max) {int left_pointer = min + 1; // 以data[min]為基準值int right_pointer = max;int standard_value = data[min];while (left_pointer <= right_pointer){while (data[left_pointer] <= standard_value && left_pointer <= max) // 后面的必須是 <=,不能是 < left_pointer++; // left = max 極端臨界狀態while (data[right_pointer] > standard_value) // 不可能小于最小邊界,因為[min]是標準值的位置right_pointer--;if (left_pointer < right_pointer) {swap(data[left_pointer], data[right_pointer]);left_pointer++;right_pointer--;}}// 【結束狀態】// 置換結束之后,right指向的是比基準值小的,left指向的是比基準值大的,所以換rightswap(data[right_pointer], data[min]); return right_pointer; }void quick_sort(int data[], int min, int max) {// conquerif (min >= max)return;else{// divide [ small | standard | large ]int standard_value_index = partition_array(data, min, max);quick_sort(data, min, standard_value_index - 1);quick_sort(data, standard_value_index + 1, max);}// don't need merge }int main() {cout << "start" << endl;int a[] = { 5,4,3,2,1 };int length = sizeof(a) / sizeof(a[0]);quick_sort(a, 0, length - 1);for (int i = 0; i < length; i++) {cout << a[i] << " ";}return 0; }

把握排序算法

  • 分:重點,做出簡單的排序,將基準線放中間,左邊都小,右邊都大
  • 治:一個元素或者無元素,一定有序
  • 合:不需要合,自然有序
  • 對于分的策略,注意幾個問題

  • 幾個狀態
  • 初態
  • 動態
  • 終態
  • 在初態,選擇一個基準點,然后依次比較后面的元素。

    動態過程中,注意等號問題,選取極端情況(比如完全倒序),快速判定有無等號。

    終態:左指針指向大的,右指針指向小的,左指針在右指針的右邊

    對于終態之后,我們將右指針的元素與基準元素換位,就可以獲取我們最初的劃分目標,之后再進行遞歸和治理。

    對于之前的歸并排序,重點是的策略,而快速排序重點則是的策略。

    但是它們都是分、治、合的分治策略,只不過側重點不同。

    總結

    以上是生活随笔為你收集整理的【算法】学习笔记(5):快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。

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