排序-快速排序 O(n log n)

快排:

1、設定一個中間值 q[? l+r >>1? ] , 讓左右區間來比較

2、左邊通過 i++ 依次比較,如果比這個中間值小,就繼續++ , 直到不符合

3、右邊通過 j-- 依次比較,如果比這個中間值大,就繼續++ ,直到不符合

4、兩邊指針都停止,代表此時左邊此時的值,是大的。右邊此時的值,是小的。讓他們2個交換

5、當左邊指針 i 走到了 右邊指針J 的區間中,這時候我們要重新劃定sort范圍

也就是再來一次quicksort() , 只不過這一次區間不一樣

  • 左子區間?[l, j]:包含所有 ≤?x?的元素,且已經與右子區間分離(左子區間的最大值 ≤ 右子區間的最小值)。
  • 右子區間?[j+1, r]:包含所有 ≥?x?的元素,同理與左子區間分離。

遞歸處理這兩個子區間的目的是:`

  1. 讓每個子區間內部的元素繼續排序(通過同樣的分區邏輯)。
  2. 由于子區間已經與原區間的其他部分 “分離”(滿足左 ≤ 右),最終整個數組會自然有序。

兩個遞歸的意義:

我進入了一個區間中,然后執行這個區間內的左右兩邊的排序:

quicksort(q,l,j);
quicksort(q,j+1,r);

第一個快排一直在遞歸,直到觸發了返回條件,此時執行第二個快排quicksort(q,j+1,r);

注意,此時的邊界參數 是最底層遞歸的參數,現在是在一個極小的區間中進行排序

排序完了以后,我這個大的quicksort()就結束了,然后執行我的上一層的區間,也就是他的右邊的排序quicksort(q,j+1,r);

這樣一路往上回溯,從2個小區間開始排序上去,最終就是左右區間都有序,且達成左邊一直小于右邊

1、其實關鍵是要記住:遞歸的“每一步”不是“順序執行完左再執行右”,而是“先把左拆到最小,解決完左再回頭拆右”,可以用“拆快遞”的例子把這個過程拆透(就用數組 [3,1,4,2],基準選第一個數 3):

2、第一步:先拆“左區間”,拆到不能再拆:

????????原數組分區后:左區間 [1,2](比3小)、基準3(已歸位)、右區間 [4](比3大)
此時遞歸會先處理 左區間 [1,2],暫時“擱置”右區間 [4]:

?????????? ?1.?? ?對 [1,2] 選基準1,分區后:左區間空(跳出條件)、基準1(歸位)、右區間 [2]? ? ? ?????????

?? ?????????2.?? ?接著處理 [1,2] 的右區間 [2]:這是只有1個元素的子數組(滿足跳出條件),直接返回

?????????? ?3.?? ?到這里,左區間 [1,2] 已經全部排好(變成 [1,2]),“左半部分”徹底解決

3、第二步:回頭處理之前“擱置”的“右區間”:

????????左區間解決完后,才會回頭處理最開始擱置的 右區間 [4]:

????????右區間 [4] 只有1個元素(滿足跳出條件),直接返回,“右半部分”也解決

4、第三步:拼起來就是最終結果

????????左區間 [1,2] + 基準3 + 右區間 [4] → 最終有序數組 [1,2,3,4]

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>//快排
void quicksort(int q[],int l,int r)
{if(l>=r) return ;int temp;int i = l-1;int j = r+1;int x = q[l+r <<1];while(i<j){do i++ ; while(q[i]<x);do j-- ; while(q[j]>x);if(i<j){temp = q[i];q[i] = q[j];q[j] = temp;}}/*遞歸處理這兩個子區間的目的是:讓每個子區間內部的元素繼續排序(通過同樣的分區邏輯)。由于子區間已經與原區間的其他部分 “分離”(滿足左 ≤ 右),最終整個數組會自然有序。*/quicksort(q,l,j);quicksort(q,j+1,r);} int main()
{int q[5] = {133,5020,10122,30,455};int len = sizeof(q) / sizeof(q[0]);quicksort(q,0,len-1);for(int i = 0;i<len;i++){printf("%d ",q[i]);}return 0;
}

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

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

相關文章

【Proteus仿真】定時器控制系列仿真——LED小燈閃爍/流水燈/LED燈帶控制/LED小燈實現二進制

目錄 0案例視頻效果展示 0.1例子1&#xff1a;基于AT89C51單片機的定時器控制小燈閃爍 0.2例子2&#xff1a;基于AT89C51單片機的定時器T0流水燈 0.3例子3&#xff1a;基于AT89C51單片機的定時器控制LED燈帶 0.4例子4&#xff1a;基于AT89C51單片機的定時器控制LED閃爍 0…

進階向:密碼生成與管理工具

密碼生成與管理工具&#xff1a;從零開始的完全指南在現代數字生活中&#xff0c;密碼是保護個人信息和賬戶安全的第一道防線。隨著網絡服務的普及&#xff0c;每個人平均需要管理數十個不同賬戶的密碼。一個強大且獨特的密碼通常應包含12個以上字符&#xff0c;混合大小寫字母…

解決 Gitee 中 git push 因郵箱隱私設置導致的失敗問題

解決 Gitee 中 git push 因郵箱隱私設置導致的失敗問題 在使用 Git 向 Gitee 遠程倉庫推送代碼時&#xff0c;可能會遇到因郵箱隱私設置引發的 git push 失敗情況。最近我就碰到了&#xff0c;現在把問題現象、原因和解決方法分享出來。 一、錯誤現象 執行 git push -u origin …

Flutter的三棵樹

“三棵樹”是 Flutter 渲染和構建UI的核心機制&#xff0c;理解它們對于掌握 Flutter 至關重要。這三棵樹分別是&#xff1a; Widget 樹 Element 樹 RenderObject 樹 它們協同工作&#xff0c;以實現 Flutter 的高性能渲染和高效的響應式編程模型。 Flutter 是聲明式的UI&…

同一臺nginx中配置多個前端項目的三種方式

目錄 第一種方式:配置多個二級域名 第二種方式:配置端口轉發(不推薦) 第三種方式:同一個server中基于location配置(重點講解) 第一種方式:配置多個二級域名 一個域名下面申請多個二級域名,每個二級域名配置一個vue前端項目,這個很好配置,在這里不再詳細說明。 …

第二家公司雖然用PowerBI ,可能更適合用以前的QuickBI

第二家公司雖然用PowerBI &#xff0c;可能更適合用以前的QuickBI現在回想一下&#xff0c;第二家公司數據源是MySQL &#xff0c;常規報表是用excel報表&#xff0c;另外還做了一張能發布到web的看板供運營使用。基于基本情況&#xff0c;quickbi 的早期版本是合適的&#xff…

STM32 USBx Device HID standalone 移植示例 LAT1466

關鍵字&#xff1a;USBx&#xff0c; Device, HID&#xff0c;standalone 1.設計目的 目前 USBx Device standalone 的官方示例較少&#xff0c;不過使用 STM32CubeMX 可以快速地生成 USBx Device 相關類的示例工程&#xff0c;會很方便大家的開發。這里以 NUCLEO-H563 為例&…

python創建并寫入excel文件

大家好&#xff0c;這里是七七&#xff0c;今天來跟大家分享一個python創建并寫入一個excel文件的小例子&#xff0c;話不多說&#xff0c;開始介紹。首先我們來看一下這一小段代碼。import openpyxl# 創建一個新的 Excel 工作簿workbook openpyxl.Workbook()# 獲取當前活動的…

react native 出現 FATAL EXCEPTION: OkHttp Dispatcher

react native 出現 FATAL EXCEPTION: OkHttp Dispatcher 報錯信息FATAL EXCEPTION: OkHttp DispatcherProcess: , PID: 8868java.lang.NoSuchMethodError: No virtual method toString(Z)Ljava/lang/String; in class Lokhttp3/Cookie; or its super classes (declaration of o…

sentinel實現控制臺與nacos數據雙向綁定

有兩種方式可以實現&#xff1a;Springboot客戶端做相應配置&#xff08;推薦&#xff09;修改sentinel-dashboard的源碼一、Springboot客戶端做相應配置&#xff08;推薦&#xff09;1、添加依賴<dependency><groupId>com.alibaba.csp</groupId><artifac…

Kubernetes (k8s)

Kubernetes (k8s) 以下是一份 ?Kubernetes (k8s) 基礎使用教程&#xff0c;涵蓋從環境搭建到核心操作的完整流程&#xff0c;附詳細命令和示例&#xff1a; &#x1f680; ?一、環境準備&#xff08;3種方式&#xff09;?? ?1. 本地開發環境&#xff08;推薦&#xff09;?…

三打ANSYS HFSS

2. 激勵方式&#xff08;端口&#xff09;詳細對比分析在HFSS中&#xff0c;“激勵方式”和“端口”這兩個詞經常混用&#xff0c;但嚴格來說&#xff0c;“端口”是實現“激勵”的一種最主要的方式。端口類型工作原理適用情況優點缺點波端口 (Wave Port)默認首選。計算端口的固…

3.python——數據類型轉換

python的數據類型轉換分為兩種&#xff1a; 隱式轉換&#xff1a;自動完成 顯式轉換&#xff1a;用類型函數轉換 隱式轉換 # 自動轉為浮點數 num_int 123 num_flo 1.23num_new num_int num_flo顯式轉換 整型 x int(1) # x 輸出結果為 1 y int(2.8) # y 輸出結果為 2 z …

迅為RK3568開發板OpenHarmonyv3.2-Beta4版本測試-命令終端

將串口連接到開發板的調試串口&#xff0c;進入 OpenHarmony 系統后&#xff0c;會自動進入 OpenHarmony終端&#xff0c;如下圖所示&#xff1a;

【面試題】介紹一下BERT和GPT的訓練方式區別?

BERT(雙向編碼器): 預訓練任務: 掩碼語言模型(MLM):隨機掩蓋15%的token,其中: 80%替換為[MASK] 10%替換為隨機token 10%保持原樣 下一句預測(NSP):判斷兩個句子是否連續(后續版本已移除) 訓練特點: 使用雙向Transformer編碼器 同時利用左右上下文信息 適合理解類任…

邪修實戰系列(1)

1、第一階段邪修實戰總覽&#xff08;9.1-9.30&#xff09; 把第一階段&#xff08;基礎夯實期&#xff09;的學習計劃拆解成極具操作性的每日行動方案。這個計劃充分利用我“在職學習”的特殊優勢&#xff0c;強調“用輸出倒逼輸入”&#xff0c;確保每一分鐘的學習都直接服務…

XR數字融合工作站打造智能制造專業學習新范式

智能制造是工業4.0的核心發展方向&#xff0c;涵蓋數字化設計、智能生產、工業機器人、數字孿生、物聯網等關鍵技術。然而&#xff0c;傳統教學模式在設備成本高、實訓風險大、抽象概念難理解等方面存在諸多挑戰。XR數字融合工作站,利用VR/AR/MR等技術&#xff0c;通過虛擬仿真…

基于FPGA實現數字QAM調制系統

基于FPGA實現數字QAM調制系統題目要求一、代碼設計1.頂層2.分頻3.m序列4.串轉并5.映射6.正弦波余弦波生成ROM和7.ask二、仿真波形總結題目要求 FPGA實現數字QAM調制系統要求根據正交振幅調制原理&#xff0c;利用正弦載波信號發生器&#xff0c;實現調制信號。調制原理會利用到…

DAY 22 復習日

浙大疏錦行復習日 仔細回顧一下之前21天的內容&#xff0c;沒跟上進度的同學補一下進度。 作業&#xff1a; 自行學習參考如何使用kaggle平臺&#xff0c;寫下使用注意點&#xff0c;并對下述比賽提交代碼 導入需要的庫 import pandas as pd # 用于數據處理和分析&#xff0c;…

biocmanager安裝 庫 老是提示網絡連接錯誤 才嘗試各種辦法

您好&#xff0c;遇到 BioManager &#xff08;通常是 BiocManager&#xff09;安裝R包時提示網絡連接錯誤確實非常令人頭疼。這通常與R/RStudio的配置、網絡環境&#xff08;尤其是國內用戶&#xff09;或SSL證書問題有關。 請不要著急&#xff0c;我們可以按照從易到難的順序…