排序算法實戰(上)


一、引言

在力扣刷題的旅程中,排序類題目是繞不開的重要板塊。今天就來分享兩道經典排序題——912. 排序數組和75. 顏色分類的解題思路與代碼實現,帶你深入理解排序算法在實際題目中的應用 。

二、題目剖析與解題思路

(一)912. 排序數組

題目要求

給定整數數組 ?nums?,需在不使用內置排序函數、時間復雜度為 ?O(nlog(n))??且空間復雜度盡可能小的條件下,將數組升序排列。

解題思路——快速排序

快速排序是分治思想的典型應用,平均時間復雜度為 ?O(nlog(n))??,空間復雜度主要是遞歸棧空間,合理實現可做到較小空間占用。

1.?劃分分區:從數組中選取一個基準值(?key?),通過一趟遍歷,將數組分成兩部分,小于基準值的元素放到左邊,大于基準值的放到右邊。這里為了避免最壞情況(如數組有序時基準值選兩端導致時間復雜度退化到 ?O(n2)??),采用隨機選取基準值的方式(?get??函數實現)。
2.?遞歸排序:對劃分后的左右兩個子數組,遞歸地進行快速排序操作,直到子數組長度為 1(遞歸終止條件),此時數組自然有序。


(二)75. 顏色分類

題目要求

給定包含 ?0?(紅)、?1?(白)、?2?(藍)的數組 ?nums?,需原地排序,使相同顏色相鄰,且按紅、白、藍順序排列,同時不能使用內置 ?sort??函數。

解題思路——三指針法

利用三個指針來劃分不同顏色區域,實現一次遍歷完成排序,時間復雜度 ?O(n)??,空間復雜度 ?O(1)?(原地排序)。

- ?L??指針標記 ?0??區域的右邊界,?R??指針標記 ?2??區域的左邊界,?i??指針用于遍歷數組。
- 遍歷過程中:遇到 ?0??,和 ?L??指針右側元素交換,同時 ?L??右移、?i??右移(因為交換來的元素已遍歷過,可直接處理下一個);遇到 ?1??,直接 ?i??右移;遇到 ?2??,和 ?R??指針左側元素交換,?R??左移,但 ?i??不右移(交換來的元素未遍歷過,需重新判斷) 。


三、代碼實現(C++)

(一)912. 排序數組(快速排序實現)

#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;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; ?// 遞歸終止條件,子數組長度為1int i = l, left = l - 1, right = r + 1;int key = get(nums, l, r); ?// 獲取隨機基準值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 get(vector<int>& nums, int l, int r) {int t = rand();return nums[t % (r - l + 1) + l]; ?// 隨機選取基準值}
};



(二)75. 顏色分類(三指針法實現)

#include <vector>
using namespace std;class Solution {
public:void sortColors(vector<int>& nums) {int L = -1, R = nums.size(); ?// L 初始為 -1,R 初始為數組長度for (int i = 0; i < R;) { ?// i 遍歷數組,R 左側是未處理區域if (nums[i] == 0) swap(nums[++L], nums[i++]);else if (nums[i] == 1) i++;else if (nums[i] == 2) while (nums[i] == 2 && i < R) swap(nums[i], nums[--R]);}}
};




四、總結

- 912. 排序數組借助快速排序,通過隨機選基準值優化,在平均情況下滿足 ?O(nlog(n))??時間復雜度要求,實現高效排序;
- 75. 顏色分類利用三指針法,巧妙劃分不同顏色區域,一次遍歷完成排序,時間復雜度 ?O(n)??,空間復雜度 ?O(1)??,非常適合這類特定元素(只有 0、1、2 )的排序場景。

刷題過程中,理解算法思想并靈活運用到不同題目場景至關重要,大家可以多嘗試不同解法,加深對排序算法的掌握,助力力扣刷題之路~ ?后續也會繼續分享更多有趣的力扣題目解法,歡迎持續關注呀!

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

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

相關文章

python學智能算法(二十)|SVM基礎概念-感知機算法及代碼

引言 前序學習進程中&#xff0c;已經學習了超平面的基礎知識&#xff0c;學習鏈接為&#xff1a;超平面 在此基礎上&#xff0c;要想正確繪制超平面&#xff0c;還需要了解感知機的相關概念。 感知機 感知機是對生物神經網絡的模擬&#xff0c;當輸入信號達到感知機的閾值時…

操作HTML網頁

一、HTML網頁的介紹 HTML&#xff0c;即超文本標記語言&#xff08;HyperText Markup Language&#xff09;&#xff0c;它不是一種編程語言&#xff0c;而是一種標記語言&#xff0c;用于描述網頁的結構。HTML 通過一系列標簽來定義網頁中的各種元素&#xff0c;如文本、圖片…

Django--03視圖和模板

Django–03視圖和模板 Part 3: Views and templates 本教程承接第二部分&#xff0c;我們將繼續開發投票應用&#xff0c;重點介紹 Django 的表單處理和通用視圖。 文章目錄Django--03視圖和模板前言概述一、編寫更多視圖二、編寫實際執行操作的視圖三、快捷方式&#xff1a;r…

《每日AI-人工智能-編程日報》--2025年7月15日

介紹&#xff1a;AI &#xff1a;英偉達恢復向中國銷售 H20 并推出新 GPU&#xff1a;7 月 15 日&#xff0c;英偉達官宣將恢復向中國銷售 H20&#xff0c;并推出全新的 NVIDIA RTX PRO GPU&#xff0c;其中 B30 性能約為 H20 的 75%&#xff0c;定價在 6500 至 8000 美元之間&…

C++STL-list

一.基礎概念相當于數據結構里面的雙向鏈表二.基礎操作1.list對象創建1. 默認構造函數list<int> l1;2. 初始化列表list<int> l2_1 { 9,8,7,6,5 };list<int> l2_2({ 9, 8, 7, 1, 5 });3. 迭代器list <int> l3(l2_1.begin(), l2_1.end());4. 全0初始化li…

【PTA數據結構 | C語言版】字符串插入操作

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;將給定字符串 t 插入到另一個給定字符串 s 的第 pos 個字符的位置。 輸入格式&#xff1a; 輸入先后給出主串 s 和待插入的字符串 t&#xff0c;每個非空字符串占一行&#…

Postman + Newman + Jenkins 接口自動化測試

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 </

CAS單點登錄架構詳解

目錄 概述核心概念 TGC (Ticket Granting Cookie)TGT (Ticket Granting Ticket)ST (Service Ticket) 架構設計 整體架構存儲架構安全機制 工作流程 完整登錄時序流程步驟詳解 技術實現 會話管理數據同步問題最佳實踐 參考資料 概述 CAS (Central Authentication Service) 是…

C++中正則表達式詳解和實戰示例

C 中的正則表達式&#xff08;Regular Expression&#xff09;主要通過標準庫 <regex> 提供&#xff0c;能夠用于字符串匹配、查找、替換、驗證格式等。它在 C11 中首次引入&#xff0c;并在 C14 和 C17 中逐步完善。一、頭文件和命名空間 #include <regex> #inclu…

深入解析Avro、Protobuf與JSON:序列化技術的選擇與應用

在現代分布式系統和數據交換場景中&#xff0c;序列化技術是數據存儲、傳輸和通信的核心。本文深入探討三種主流序列化技術&#xff1a;Avro、Protobuf 和 JSON&#xff0c;從背景、特點、示例代碼&#xff08;Python&#xff09;、優勢及最佳實踐等多個維度進行對比分析&#…

Vue 中 effectScope() 的全面解析與實戰應用

一、effectScope 概述1.1 什么是 effectScopeeffectScope() 是 Vue 3.2 引入的核心 API&#xff0c;用于創建副作用作用域容器。它能夠將多個響應式副作用&#xff08;如 watch、watchEffect 和 computed&#xff09;組織在一起&#xff0c;實現統一的生命周期管理。1.2 核心價…

嵌入式面試八股文(十六)·一文搞懂嵌入式常用名詞IC、ASIC、CPU、MPU、MCU、SoC、SoPC、GPU、DSP

目錄 1. IC&#xff08;Integrated Circuit&#xff0c;集成電路&#xff09; 2. ASIC&#xff08;Application-Specific Integrated Circuit&#xff0c;專用集成電路&#xff09; 3. CPU&#xff08;Central Processing Unit&#xff0c;中央處理器&#xff09; 4. M…

安全參綉25暑假第一次作業

第一天 1.首先講了d0cker的部署&#xff0c; 這個是第一個Vulhub漏洞環境。所有環境都使用D0cker容器化&#xff0c;使其易于部署和隔離測試。 其中&#xff0c;國內的阿里用不了&#xff0c;你得搞個代理&#xff0c;下國外的&#xff1a;入門指南 | Vulhub 然后按這個…

RocketMQ源碼級實現原理-消息消費總覽

Overview可以看到&#xff0c;pull message和consume message實際上是兩個過程&#xff0c;但是對于用戶是透明的 注意這三個Offset的含義&#xff0c;physical offset就是commitLog中的全局偏移量分發dispatch如上圖&#xff0c;Topic的每個queue&#xff0c;都綁定了唯一的一…

linux打包固件shell腳本

不打包 pack.sh解壓后無父目錄&#xff08;直接是文件&#xff09;生成 checksum.txt&#xff08;包含所有文件的 SHA256&#xff09;打包后 .tar.gz 移動到上級目錄#!/bin/bash# 檢查是否傳入版本號參數 if [ -z "$1" ]; thenecho "Usage: $0 <version> …

用uniapp開發鴻蒙應用(暫停更新-根據項目更新,現在項目未開始)

1.根據博客生成.hap文件 【鴻蒙HarmonyOS開發技巧&#xff1a;如何不依賴華為商店直接安裝uniapp生成的app文件&#xff1f;一鍵轉換app至hap格式教程詳解】_entry-default-signed.hap-CSDN博客 根據網絡查詢鴻蒙手機安裝測試app&#xff0c;需要電腦命令安裝 在鴻蒙HarmonyOS手…

Linux 文件系統實現層詳解:原理、結構與驅動銜接

&#x1f4c2; Linux 文件系統實現層詳解&#xff1a;原理、結構與驅動銜接 &#x1f3ac; 推薦搭配視頻學習&#xff1a;Linux 文件系統子系統&#xff1a;三層架構全面掌握 一、為什么要重點理解文件系統實現層&#xff1f; 文件系統實現層是 Linux 文件系統的“地基”&…

區塊鏈應用場景深度解讀:金融領域的革新與突破

引言&#xff1a;區塊鏈技術的演進與金融領域的變革區塊鏈技術自2008年誕生以來&#xff0c;以其去中心化、不可篡改、可追溯等特性&#xff0c;在全球范圍內引發了金融領域的深刻變革。從最初的數字貨幣實驗&#xff0c;到如今在跨境支付、證券交易、供應鏈金融等領域的廣泛應…

redisson tryLock

應用場景RLock rLock redissonClient.getLock(Constant_LOCK request.getId()); try {boolean isLocked rLock.tryLock();if (!isLocked) {throw new ServiceException(ErrConstant.OPERATION_FAILED, "請勿重復提交");}源碼public interface RLock extends Lock,…

前端docx庫實現將html頁面導出word

前言&#xff1a;最近遇到一個需求&#xff0c;需要將頁面的html導出為word文檔&#xff0c;并且包含橫向和豎向頁面&#xff0c;并且可以進行混合方向導出。經過一段時間的實驗&#xff0c;發現只有docx這個庫滿足這個要求。在這里記錄一下實現思路以及代碼。 docx官網 一、…