排序算法-----快速排序(非遞歸實現)

目錄

前言

快速排序

?基本思路

?非遞歸代碼實現


前言

? ? ? ? 很久沒跟新數據結構與算法這一欄了,因為數據結構與算法基本上都發布完了,哈哈,那今天我就把前面排序算法那一塊的快速排序完善一下,前面只發布了快速排序遞歸算法,那這一次就去用非遞歸來去實現。(遞歸算法:排序算法-----快速排序(遞歸)_快排遞歸_Gretel?Tade的博客-CSDN博客)

快速排序

?快速排序(Quicksort),計算機科學詞匯,適用領域Pascal,C++等語言,是對冒泡排序算法的一種改進。

? ? ? ? 快速排序采用的是分治思想,即在一個無序的序列中選取一個任意的基準元素pivot,利用pivot將待排序的序列分成兩部分,前面部分元素均小于或等于基準元素,后面部分均大于或等于基準元素,然后采用遞歸的方法分別對前后兩部分重復上述操作,直到將無序序列排列成有序序列。

?基本思路

現在給定一個數組初始?[25,24,6,65,11,43,22,51] ,然后進行快速排序

?第一步,先選取一個參考數字temp,一般選取第一個即temp=25,然后標記最左邊和最右邊數字的位置分別為i, j

?25? ? ? ? 24? ? ? ? 6? ? ? ? 64? ? ? ? 11? ? ? ? 43? ? ? ? 22? ? ? ? 51

? i? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?j

temp

?第二步,先去向左移動j 的位置,當j指向的數字小于temp時候,就停止移動,然后開始向右移動i?

當i 移動到比temp要大的數字時,停止移動,此時將i 和 j 指向的數字進行交換,如下所示:

?25? ? ? ? 24? ? ? ? 6? ? ? ? 64? ? ? ? 11? ? ? ? 43? ? ? ? 22? ? ? ? 51

temp? ? ? ? ? ? ? ? ? ? ? ? ? ? ?i? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?j

交換后:

?25? ? ? ? 24? ? ? ? 6? ? ? ? 22? ? ? ? 11? ? ? ? 43? ? ? ? 65? ? ? ?51

temp? ? ? ? ? ? ? ? ? ? ? ? ? ? ?i? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?j

?第三步,此時,開始接著移動 j,當j 移動到比temp要小的數字的時候,停止移動, 如下所示:

?25? ? ? ? 24? ? ? ? 6? ? ? ? 22? ? ? ? 11? ? ? ? 43? ? ? ? 65? ? ? ?51

temp? ? ? ? ? ? ? ? ? ? ? ? ? ? ?i? ? ? ? ? ?j

?然后開始移動i ,當i 移動到與j 相遇的位置時,i停止移動(如果i 移動到比temp要大的數字的時候就執行上面的第二步,i與j 進行數字交換)

?25? ? ? ? 24? ? ? ? 6? ? ? ? 22? ? ? ? 11? ? ? ? 43? ? ? ? 65? ? ? ?51

temp? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?i,j

第四步,此時,i與j指向的數字與temp指向的數字進行數字交換

?11? ? ? ? 24? ? ? ? 6? ? ? ? 22? ? ? ? 25? ? ? ? 43? ? ? ? 65? ? ? ?51

temp? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?i,j

這時候我們會發現,此時i和j指向的數字的位置,左邊的都比這個數字要小,右邊的都比這個數字要大,于是我們就可以去進入到遞歸,分別對左邊和右邊的數字進行以上步驟的遞歸,最后兩邊的數字都會被排好序。

動態圖

?非遞歸代碼實現

#include<stdio.h>
#include<stdlib.h>
//每一趟排序
int sort(int* arr, int left, int right) {int i = left;int j = right;int temp = arr[left];while (i != j) {while (temp <= arr[j] && i < j)//j左移j--;while (temp >= arr[i] && i < j)//i向右移i++;if (i < j) {//i與j都停止移動的時候,交換數字int t = arr[i];arr[i] = arr[j];arr[j] = t;}}//此時i與j相遇,進行數字交換arr[left] = arr[i];arr[i] = temp;return i;//返回這個交匯點
}void quick_sort(int* arr, int left, int right) {int* stack = (int*)malloc(sizeof(int) * right);//創建一個數組棧for (int i = 0; i < right; i++)stack[i] = -1;//初始化為-1int count = 0;//當前棧數據的個數if (left < right) {//入棧stack[count++] = left;stack[count++] = right;}while (count) {//當棧為非空的時候//出棧操作int r_pop = stack[count-1];int l_pop = stack[count-2];stack[count - 1] = stack[count - 2] = -1;//出棧后,清空已出棧數據,設置為-1count -= 2;int i = sort(arr, l_pop, r_pop);//如果這個交匯點前面數據的下標比當前最左邊的數據下標要大的話,就入棧if (l_pop < i - 1) {stack[count++] = l_pop;stack[count++] = i - 1;}//如果這個交匯點后面一個數據的下標比當前最右邊數據的下標要小的話,入棧if (r_pop > i + 1) {stack[count++] = i + 1;stack[count++] = r_pop;}}//釋放空間free(stack);stack = NULL;
}int main() {int array[8] = { 25,24,6,65,11,43,22,51 };printf("排序前:");for (int i = 0; i < sizeof(array) / sizeof(int); i++) {printf("%d ", array[i]);}printf("\n排序后:");quick_sort(array, 0, sizeof(array) / sizeof(int) - 1);for (int i = 0; i < sizeof(array) / sizeof(int); i++) {printf("%d ", array[i]);}
}

運行結果:

以上就是本期的全部內容了,喜歡的話給個贊吧!

分享一張壁紙:?

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

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

相關文章

單鏈表相關面試題--3.鏈表的中間節點

3.鏈表的中間節點 876. 鏈表的中間結點 - 力扣&#xff08;LeetCode&#xff09; /* 解題思路&#xff1a; 通過快慢指針找到中間節點&#xff0c;快指針每次走兩步&#xff0c;慢指針每次走一步&#xff0c;當快指針走到結尾的時候&#xff0c;慢指針正好走到中間位置 */ typ…

HTTPS協議的加密流程

目錄 一&#xff0c;HTTPS是什么 二&#xff0c;兩種加密方式 三&#xff0c;HTTPS的加密過程 3.1 引入對稱加密 3.2 引入非對稱加密 3.3 引入證書 一&#xff0c;HTTPS是什么 HTTPS也是一個應用層協議&#xff0c;它是在HTTP協議的基礎上引入了一個加密層。因為HTTP協議…

每天一道算法題(十)——獲取和為k的子數組

文章目錄 1、問題2、示例3、解決方法&#xff08;1&#xff09;方法1——雙指針 總結 1、問題 給你一個整數數組 nums 和一個整數 k &#xff0c;請你統計并返回 該數組中和為 k 的子數組的個數 。 子數組是數組中元素的連續非空序列。 2、示例 示例 1&#xff1a; 輸入&#x…

多分類自定義采樣比例

多分類自定義采樣比例 import torch from torch.utils.data import DataLoader, Dataset, WeightedRandomSampler from torchvision import transforms from torchvision.datasets import ImageFolder# 假設你有一個自定義的數據集類 class CustomDataset(Dataset):def __init…

51單片機按鍵控制LED燈亮滅的N個玩法

51單片機按鍵控制LED燈亮滅的N個玩法 1.概述 這篇文章介紹按鍵的使用&#xff0c;以及通過控制LED燈的小實驗&#xff0c;發現按鍵中存在的問題&#xff0c;然后思考并解決這些問題。達到熟練使用按鍵控制元器件。 2.搭建硬件環境 1.硬件準備 名稱型號數量單片機STC12C205…

2023全球數字貿易創新大賽9-12

目錄 回答評委提問:先說痛點-再說怎樣解決 食品安全溯源是否全流程 星火? 鏈網

Sleuth

Sleuth 一 引言 隨著服務的越來越多&#xff0c;對調?鏈的分析會越來越復雜。它們之間的調?關系也許如下圖&#xff1a; 問題&#xff1a; 1&#xff1a;微服務之間的調?錯綜復雜&#xff0c;?戶發送的請求經歷那些服務&#xff0c;調?鏈不清楚&#xff0c;沒有? 個?…

【SpringCloud微服務全家桶學習筆記-Hystrix(服務降級,熔斷,接近實時的監控,服務限流等)】

服務雪崩 &#xff08;微服務面臨的問題&#xff09; 多個微服務之間調用的時候&#xff0c;假設微服務A調用微服務B和微服務C&#xff0c;微服務B和微服務C又調用其它的微服務&#xff0c;這就是所謂的“扇出”。如果扇出的鏈路上某個微服務的調用響應時間過長或者不可用&…

HarmonyOS開發(五):常用基礎組件

1、組件介紹 組件&#xff08;Component&#xff09;,是界面搭建及顯示的最小單元。 組件根據功能可以分為五大類&#xff1a;基礎組件、容器組件、媒體組件、繪制組件、畫布組件 2、基礎組件 基礎組件是視圖層的基本組成單元&#xff0c;它包含&#xff1a;Text、Image、T…

OpenCV C++ 張正友相機標定【相機標定原理、相機標定流程、圖像畸變矯正】

文章目錄 3.1 標定原理3.2 相機標定流程步驟1:采集棋盤格圖像,批處理(調整尺寸、重命名)步驟2:提取棋盤格內角點坐標步驟3:進一步提取亞像素角點信息在棋盤標定圖上繪制找到的內角點(非必須,僅為了顯示)步驟4:相機標定--計算出相機內參數矩陣和畸變系數步驟5:畸變圖像…

Spring (二)@Order, Ordered 失效

Spring &#xff08;二&#xff09;Order, Ordered 失效 先上例子 public class OrderAnnotationExample {Order(2)static class MyBeanFactoryPostProcessor1 implements BeanFactoryPostProcessor {Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFa…

如何加速JavaScript 代碼運行速度

如何加速JavaScript 代碼運行速度 前言減少DOM訪問避免不必要的變量延遲script加載異步和同步使用異步編程避免使用With關鍵詞 前言 本文主要通過五個方面來講解如何使Js代碼得到性能優化&#xff0c;從而實現加快Js代碼運行速度的作用。那么好&#xff0c;本文正式開始。 減…

感染了后綴為.[bkpsvr@firemail.cc].EKING勒索病毒如何應對?數據能夠恢復嗎?

導言&#xff1a; 在當前數字時代&#xff0c;勒索病毒成為網絡威脅的一大隱患。本文將深入介紹一種名為[bkpsvrfiremail.cc].EKING的勒索病毒&#xff0c;以及如何應對遭受其攻擊后&#xff0c;有效地恢復被加密的數據文件&#xff0c;并提供一些預防措施以減少感染的風險。數…

sqlserver==索引解析,執行計劃,索引大小

1創建測試表 -- 創建大型表 CREATE TABLE LargeTableWithIndex (ID int IDENTITY(1,1) PRIMARY KEY,IndexedColumn int,NonIndexedColumn nvarchar(255),OtherData nvarchar(255) );2插入測試數據 -- 使用 T-SQL 插入大量數據 DECLARE @i int = 1; WHILE @i <= 100000 -- …

Mac中LaTex無法編譯的問題

最近在使用TexStudio時&#xff0c;遇到一個棘手的問題&#xff1a; 無法編譯&#xff0c;提示如下&#xff1a; kpathsea: Running mktexfmt xelatex.fmt /Library/TeX/texbin/mktexfmt: kpsewhich -var-valueTEXMFROOT failed, aborting early. BEGIN failed–compilation a…

[Linux] Network: IPv6 link-local 地址是否可用不自動生成

原來有一段時間在做擴充產品的VLAN個數&#xff0c;然后就遇到過一個問題&#xff1a;說這個Linux的默認配置里&#xff0c;會為每一個網絡接口添加一個link-local的地址&#xff0c;就是FE80::開頭的地址&#xff0c;在RFC-4291里有如下的定義&#xff1a; Link-Local unicas…

redis運維(十二) 位圖

一 位圖 ① 概念 1、說明&#xff1a;位圖還是在操作字符串2、位圖玩字符串在內存中存儲的二進制3、ASCII字符通過映射轉化為二進制4、操作的是字符串value ② ASCII字符鋪墊 1、控制ASCII字符 2、ASCII可顯示字符 ③ SETBIT 細節&#xff1a; setbit 命令的返回值是之…

git常用命令(git github ssh)

目錄 1、語法說明2、本地倉庫相關操作建立一個git文件(git init)把工作區的文件添加到暫存區(git add)把暫存區的文件添加到本地倉庫(git commit)查看暫存區和本地倉庫中的文件(git ls-files)查看文件夾下所有文件的狀態(git status)查看版本庫中的提交記錄(git log)恢復的文件…