利用分治策略優化快速排序

1. 基本思想

? ? 分治快速排序(Quick Sort)是一種基于分治法的排序算法,采用遞歸的方式將一個數組分割成小的子數組,并通過交換元素來使得每個子數組元素按照特定順序排列,最終將整個數組排序。

快速排序的基本步驟:

  1. 選擇基準元素:從數組中選擇一個元素作為基準(pivot)。
  2. 分區操作:將數組分成兩個部分,左邊的部分所有元素都小于基準元素,右邊的部分所有元素都大于基準元素。此時基準元素已經排好序。
  3. 遞歸排序:對基準元素左側和右側的子數組遞歸進行快速排序。

快速排序的核心思想:

  • 分治法:通過每次選擇一個基準元素,將數組分割成兩個子數組,然后遞歸地對兩個子數組進行排序。
  • 每次選擇基準元素后,通過分區將數組劃分為兩個部分,左側部分的元素都小于基準,右側部分的元素都大于基準。
  • 遞歸對子數組進行排序,直到每個子數組的長度為 1 或 0,排序完成。
// 分區函數,返回基準元素的正確位置
int Partition(vector<int>& arr, int low, int high) {int pivot = arr[high];  // 選擇最后一個元素作為基準int i = low - 1;  // i 是小于基準元素的子數組的最后一個元素的索引// 遍歷數組,將小于基準的元素移動到數組的前面for (int j = low; j < high; ++j) {if (arr[j] < pivot) {++i;swap(arr[i], arr[j]);}}// 將基準元素放到正確的位置swap(arr[i + 1], arr[high]);return i + 1;  // 返回基準元素的索引
}// 快速排序函數
void QuickSort(vector<int>& arr, int low, int high) {if (low < high) {// 找到基準元素的索引int pi = Partition(arr, low, high);// 遞歸排序基準元素左邊和右邊的子數組QuickSort(arr, low, pi - 1);  // 排序左邊子數組QuickSort(arr, pi + 1, high); // 排序右邊子數組}
}

?2. 快速選擇算法

? ? 快速選擇算法(Quickselect) 是一種基于快速排序(Quick Sort)的算法,用于在未排序的數組中找到第 k 小(大)的元素。與快速排序不同,快速選擇只對包含第 k 小(大)元素的部分進行排序,而不需要對整個數組進行排序,因此它的時間復雜度通常較低。

快速選擇的核心思想是:

  1. 與快速排序一樣,通過選擇一個“基準”元素并進行分區(Partition)操作,將數組分成左右兩個部分。
  2. 如果基準元素的位置正好是 k,則基準元素即為第 k 小的元素。
  3. 如果基準元素的位置小于 k,則繼續在右側子數組中查找第 k 小元素。
  4. 如果基準元素的位置大于 k,則繼續在左側子數組中查找第 k 小元素。

通過將數組分成三個部分:小于基準、等于基準、大于基準,從而更有效地找到第 k 小的元素。相較于傳統的快速選擇算法,使用三個部分分區可以加速查找過程,特別是在處理重復元素時。

下面是一個示例,這類問題可以以此為模板,通過適當修改來實現不同的目標。?

int qsort(vector<int>& nums, int l, int r, int k){if(l == r) return nums[l];//1.隨機選擇基準數int key = getRandom(nums, l, r);//2.根據基準數將數組分成三組int left = l - 1, right = r + 1, i = l;while(i < right){if(nums[i] < key) swap(nums[++left], nums[i++]);else if(nums[i] == key) i++;else swap(nums[--right], nums[i]); }//3.分情況討論int c = r - right + 1, b = right - left - 1;if(c >= k)return qsort(nums, right, r, k);else if(b + c >= k) return key;else  return qsort(nums, l, left, k - b - c);}int getRandom(vector<int>& nums, int left, int right){int r = rand();return nums[r % (right - left) + left];}

3. 顏色分類

解法:三指針

排序時數組被分成四個部分,[0, left] 區間都是0,(left, i)區間都是1,[i, right]區間是未排序的部分,[right , n - 1]區間都是2.

排序完成后,i與right相等,數組被分成三個部分[0, left]都是1,(left, i)都是0,[right , n - 1]都是2

class Solution {
public:void sortColors(vector<int>& nums) {int i = 0, n = nums.size();int left = -1, right = n;while(i < right){if(nums[i] == 0) swap(nums[i++], nums[++left]);else if(nums[i] == 1) i++;else if(nums[i] == 2) swap(nums[i], nums[--right]);}}
};

75. 顏色分類 - 力扣(LeetCode)

4.? 排序數組

使用將數組分成三部分的思想實現快排,效率會更高

class Solution {
public:vector<int> sortArray(vector<int>& nums) {srand(time(NULL));qsort(nums, 0, nums.size() - 1);return nums;}void qsort(vector<int>& nums, int l, int r){if(l >= r) return;int key = getRanNum(nums, l, r);//獲取隨機基準值int i = l, left = l - 1, right = r + 1;while(i < right){if(nums[i] < key) swap(nums[++left], nums[i++]);else if(nums[i] == key) i++;else swap(nums[--right], nums[i]);}qsort(nums, l, left);qsort(nums, right, r);}int getRanNum(vector<int>& nums, int left, int right){int r = rand();return nums[r % (right - left) + left];}
};

912. 排序數組 - 力扣(LeetCode)

5. 數組中第k個最大元素

快速選擇算法

class Solution {
public:int findKthLargest(vector<int>& nums, int k) {srand(time(NULL));return qsort(nums, 0, nums.size() - 1, k);}int qsort(vector<int>& nums, int l, int r, int k){if(l == r) return nums[l];//返回條件//1.隨機選擇基準數int key = getRandom(nums, l, r);//2.根據基準數將數組分成三組int left = l - 1, right = r + 1, i = l;while(i < right){if(nums[i] < key) swap(nums[++left], nums[i++]);else if(nums[i] == key) i++;else swap(nums[--right], nums[i]); }//3.分情況討論int c = r - right + 1, b = right - left - 1;if(c >= k)return qsort(nums, right, r, k);else if(b + c >= k) return key;else  return qsort(nums, l, left, k - b - c);}int getRandom(vector<int>& nums, int left, int right){int r = rand();return nums[r % (right - left) + left];}
};

215. 數組中的第K個最大元素 - 力扣(LeetCode)

6. 庫存管理

法一:排序 O(nlogn)

法二:堆排序 O(nlogk)

法三:快速選擇算法 O(n)

class Solution {
public:vector<int> inventoryManagement(vector<int>& stock, int cnt) {srand(time(NULL));qsort(stock, 0, stock.size() - 1, cnt);return {stock.begin(), stock.begin() + cnt};}void qsort(vector<int>& stock,int l, int r, int cnt){if(l == r) return;//1.隨機選擇基準數int key = getRandom(stock, l, r);//2.根據基準數將數組分成三組int left = l - 1, right = r + 1, i = l;while(i < right){if(stock[i] < key) swap(stock[++left], stock[i++]);else if(stock[i] == key) i++;else swap(stock[--right], stock[i]); }//3.分情況討論int a = left - l + 1, b = right - left - 1;if(cnt < a) qsort(stock, l, left, cnt);else if(cnt <= a + b) return;else qsort(stock, right, r, cnt - a - b);}int getRandom(vector<int>& stock, int left, int right){int r = rand();return stock[r % (right - left) + left];}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895827.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895827.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895827.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零到一實現微信小程序計劃時鐘:完整教程

在本教程中&#xff0c;我們將一起實現一個微信小程序——計劃時鐘。這個小程序的核心功能是幫助用戶添加任務、設置任務的時間范圍&#xff0c;并且能夠刪除和查看已添加的任務。通過以下步驟&#xff0c;我們將帶你從零開始實現一個具有基本功能的微信小程序計劃時鐘。 項目…

idea日常報錯之UTF-8不可映射的字符

目錄 一、UTF-8不可映射的字符的解決 1、出現這種報錯的情形 2、具體解決辦法 前言&#xff1a; 在我們日常代碼編寫的時候可能會遇到各式各樣的錯誤&#xff0c;有時候并不是你改動了代碼&#xff0c;而是莫名其妙就出現的報錯&#xff0c;今天我就遇到一個在maven編譯的時候…

人工智能技術-基于長短期記憶(LSTM)網絡在交通流量預測中的應用

人工智能技術-基于長短期記憶&#xff08;LSTM&#xff09;網絡在交通流量預測中的應用 基于人工智能的智能交通管理系統 隨著城市化進程的加快&#xff0c;交通問題日益嚴峻。為了解決交通擁堵、減少交通事故、提高交通管理效率&#xff0c;人工智能&#xff08;AI&#xff…

HTTP FTP SMTP TELNET 應用協議

1. 標準和非標準的應用協議 標準應用協議&#xff1a; 由標準化組織&#xff08;如 IETF&#xff0c;Internet Engineering Task Force&#xff09;制定和維護&#xff0c;具有廣泛的通用性和互操作性。這些協議遵循嚴格的規范和標準&#xff0c;不同的實現之間可以很好地進行…

Matlab離線安裝硬件支持包的方法

想安裝支持樹莓派的包&#xff0c;但是發現通過matlab安裝需要續訂維護服務 可以通過離線的方式安裝。 1. 下載SupportSoftwareDownloader Support Software Downloader - MATLAB & Simulink 登錄賬號 選擇對應的版本 2. 選擇要安裝的包 3.將下載的包copy到安裝目錄下 …

Django REST Framework (DRF) 中用于構建 API 視圖類解析

Django REST Framework (DRF) 提供了豐富的視圖類&#xff0c;用于構建 API 視圖。這些視圖類可以分為以下幾類&#xff1a; 1. 基礎視圖類 這些是 DRF 中最基礎的視圖類&#xff0c;通常用于實現自定義邏輯。 常用類 APIView&#xff1a; 最基本的視圖類&#xff0c;所有其…

MyBatis攔截器終極指南:從原理到企業級實戰

在本篇文章中&#xff0c;我們將深入了解如何編寫一個 MyBatis 攔截器&#xff0c;并通過一個示例來展示如何在執行數據庫操作&#xff08;如插入或更新&#xff09;時&#xff0c;自動填充某些字段&#xff08;例如 createdBy 和 updatedBy&#xff09;信息。本文將詳細講解攔…

137,【4】 buuctf web [SCTF2019]Flag Shop

進入靶場 都點擊看看 發現點擊work會增加&#xffe5; 但肯定不能一直點下去 抓包看看 這看起來是一個 JWT&#xff08;JSON Web Token&#xff09;字符串。JWT 通常由三部分組成&#xff0c;通過點&#xff08;.&#xff09;分隔&#xff0c;分別是頭部&#xff08;Header&…

twisted實現MMORPG 游戲數據庫操作封裝設計與實現

在設計 MMORPG&#xff08;大規模多人在線角色扮演游戲&#xff09;時&#xff0c;數據庫系統是游戲架構中至關重要的一部分。數據庫不僅承擔了游戲中各種數據&#xff08;如玩家數據、物品數據、游戲世界狀態等&#xff09;的存儲和管理任務&#xff0c;還必須高效地支持并發訪…

【R語言】聚類分析

聚類分析是一種常用的無監督學習方法&#xff0c;是將所觀測的事物或者指標進行分類的一種統計分析方法&#xff0c;其目的是通過辨認在某些特征上相似的事物&#xff0c;并將它們分成各種類別。R語言提供了多種聚類分析的方法和包。 方法優點缺點適用場景K-means計算效率高需…

超全Deepseek資料包,deepseek下載安裝部署提示詞及本地部署指南介紹

該資料包涵蓋了DeepSeek模型的下載、安裝、部署以及本地運行的詳細指南&#xff0c;適合希望在本地環境中高效運行DeepSeek模型的用戶。資料包不僅包括基礎的安裝步驟&#xff0c;還提供了68G多套獨立部署視頻教程教程&#xff0c;針對不同硬件配置的模型選擇建議&#xff0c;以…

Java Spring boot 篇:常用注解

Configuration 作用 Configuration 注解的核心作用是把一個類標記為 Spring 應用上下文里的配置類。配置類就像一個 Java 版的 XML 配置文件&#xff0c;能夠在其中定義 Bean 定義和 Bean 之間的依賴關系。當 Spring 容器啟動時&#xff0c;會掃描這些配置類&#xff0c;解析其…

在 Ubuntu 20.04 為 Clash Verge AppImage 創建桌面圖標教程

在 Ubuntu 20.04 為 AppImage 創建桌面圖標教程 一、準備工作 確保你已經下載了 xxxx.AppImage 文件&#xff0c;并且知道它所在的具體路徑。同時&#xff0c;你可以準備一個合適的圖標文件&#xff08;.png 格式&#xff09;用于代表該應用程序&#xff0c;如果沒有合適的圖…

【復現DeepSeek-R1之Open R1實戰】系列6:GRPO源碼逐行深度解析(上)

目錄 4 GRPO源碼分析4.1 數據類 GRPOScriptArguments4.2 系統提示字符串 SYSTEM_PROMPT4.3 獎勵函數4.3.1 accuracy_reward函數4.3.2 verify函數4.3.3 format_reward函數 4.4 將數據集格式化為對話形式4.5 初始化GRPO Trainer 【復現DeepSeek-R1之Open R1實戰】系列3&#xff1…

【雜談】加油!!!!

為了在三月底前系統準備Java后端開發的面試和筆試&#xff0c;以下是分階段的高效學習計劃&#xff1a; 一、知識體系構建&#xff08;第1-2周&#xff09; 核心基礎強化 Java基礎&#xff08;每日1.5小時&#xff09;&#xff1a; 重點掌握&#xff1a;JVM內存模型&#xff0…

python旅游推薦系統+爬蟲+可視化(協同過濾算法)

??基于用戶的協同過濾算法 ??有后臺管理 ??2w多數據集 這個旅游數據分析推薦系統采用了Python語言、Django框架、MySQL數據庫、requests庫進行網絡爬蟲開發、機器學習中的協同過濾算法、ECharts數據可視化技術&#xff0c;以實現從網站抓取旅游數據、個性化推薦和直觀展…

HarmonyNext上傳用戶相冊圖片到服務器

圖片選擇就不用說了&#xff0c;直接用 無須申請權限 。 上傳圖片&#xff0c;步驟和android對比稍微有點復雜&#xff0c;可能是為了安全性考慮&#xff0c;需要將圖片先拷貝到緩存目錄下面&#xff0c;然后再上傳&#xff0c;當然你也可以轉成Base64&#xff0c;然后和服務…

同為科技智能PDU助力Deepseek人工智能和數據交互的快速發展

1 2025開年&#xff0c;人工智能領域迎來了一場前所未有的變革。Deepseek成為代表“東方力量”的開年王炸&#xff0c;不僅在國內掀起了技術熱潮&#xff0c;并且在全球范圍內引起了高度關注。Deepseek以顛覆性技術突破和現象級應用場景席卷全球&#xff0c;這不僅重塑了產業格…

二、QEMU NFS 環境搭建

? 在上一章節中&#xff0c;我們已經成功完成了內核和 busybox 環境的配置。為了進一步提高開發效率&#xff0c;我們可以使用 NFS&#xff08;Network File System&#xff09;來掛載根目錄。NFS 允許我們將本地文件系統通過網絡共享給虛擬機使用&#xff0c;這樣在開發過程中…

.NET 9.0 的 Blazor Web App 項目中 EF Core 【事務】使用備忘

一、DbContext.Database.BeginTransactionAsync() 模式 1. 注意事項&#xff1a;連接字符串中啟用了 MARS&#xff08;Multiple Active Result Sets&#xff1a;MultipleActiveResultSetsTrue &#xff09;后&#xff0c;無法創建 保存點&#xff08;保存點與 SQL Server 的多…