C++快速排序算法簡(jiǎn)明理解
一、問(wèn)題描述
[問(wèn)題] 應(yīng)用快速排序方法對(duì)一個(gè)記錄序列進(jìn)行升序排列??焖倥判?quick sort)的分治策略如下。
(1)劃分:選定一個(gè)記錄作為軸值,以軸值為基準(zhǔn)將整個(gè)序列劃分為兩個(gè)子序列r(1)… r(i-1))和r(i+1)…r(n),軸值的位置i在劃分的過(guò)程中確定,并且前一個(gè)子序列中的記錄均小于或等于軸值,后一個(gè)子序列中的記錄均大于或等于軸值;
(2)求解子問(wèn)題:分別對(duì)劃分后的每一個(gè)子序列造歸處理;
(3)合并:由于子序列排序是就地進(jìn)行的,所以合并不需要任何操作。
二、想法
[想法] 首先對(duì)待 排序記錄序列進(jìn)行劃分,劃分的軸值應(yīng)該遵循平衡子問(wèn)題的原則,使劃分后的兩個(gè)子序列的長(zhǎng)度盡量相等,這是決定快速排序算法時(shí)間性能的關(guān)鍵。軸值的選擇有很多方法,例如,可以隨機(jī)選出一個(gè)記錄作為軸值,從而期望劃分是較平衡的。
第一次劃分過(guò)程:
后續(xù)排序結(jié)果:
三、算法實(shí)現(xiàn)
int Partition(int r[],int start,int end) { int i=start,j=end; while(i<j) { while (i<j&&r[i]<=r[j]) //對(duì)右側(cè)掃描,即r[i] 與右側(cè)的r[j...i+1]比較,升序排序,如果有小于r[i]的值,即右小于左則跳出循環(huán),還有i>=j也跳出循環(huán),即比較完,沒(méi)有比它小的,必須兩個(gè)條件同時(shí)滿(mǎn)足。 j--; if(i<j) { //在i<j的情況下滿(mǎn)足r[j]<r[i] r[i]=r[i]^r[j]; //交換值 r[j]=r[i]^r[j]; //注意:如果位置一樣不可以使用異或交換值,即r[1]不能異或r[1]; r[i]=r[i]^r[j]; //也可以定義中間值,進(jìn)行交換 i++; } } while (i<j&&r[i]<=r[j])//對(duì)左側(cè)掃描,即r[j] 與左側(cè)的r[i...j-1]比較,升序排序,如果有大于r[j]的值,即左側(cè)值大于右側(cè)值則跳出循環(huán),還有i>=j也跳出循環(huán),即比較完,沒(méi)有比它大的,必須兩個(gè)條件同時(shí)滿(mǎn)足。 i++; if(i<j) { //在i<j的情況下滿(mǎn)足r[i]>r[j] r[i]=r[i]^r[j]; r[j]=r[i]^r[j]; r[i]=r[i]^r[j]; j--; } return i; //返回軸值 } void Quicksort(int r[],int start ,int end) { //快速排序 int pivot; //記錄軸值 if(start<end) { //界限值 pivot=Partition(r,start,end); //排序并獲得軸值 Quicksort(r,start,pivot-1); //對(duì)軸值左側(cè)遞歸 Quicksort(r,pivot+1,end); //對(duì)軸值右側(cè)遞歸 } }
總結(jié)
快速排序是眾多排序方法中,較為重要的一種,它在排序算法中具有排序速度快,而且是就地排序等優(yōu)點(diǎn),使得在許多編程語(yǔ)言的內(nèi)部元素排序?qū)崿F(xiàn)中采用的就是快速排序,很多面試題中也經(jīng)常遇到。
到此這篇關(guān)于C++快速排序算法簡(jiǎn)明理解的文章就介紹到這了,更多相關(guān)C++快速排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++基礎(chǔ)入門(mén)教程(七):一些比較特別的基礎(chǔ)語(yǔ)法總結(jié)
這篇文章主要介紹了C++基礎(chǔ)入門(mén)教程(七):一些比較特別的基礎(chǔ)語(yǔ)法總結(jié),本文總結(jié)的都是一些特殊的語(yǔ)法,需要的朋友可以參考下2014-11-11C/C++ 中memset() 函數(shù)詳解及其作用介紹
這篇文章主要介紹了C/C++ 中memset() 函數(shù)詳解及其作用介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07C語(yǔ)言基礎(chǔ)之C語(yǔ)言格式化輸出函數(shù)printf詳解
這篇文章主要介紹了C語(yǔ)言格式化輸出函數(shù)printf詳解,printf函數(shù)中用到的格式字符與printf函數(shù)中用到的格式修飾符,感興趣的小伙伴可以借鑒一下2023-03-03C語(yǔ)言求兩個(gè)正整數(shù)的最大公約數(shù)示例代碼
在C語(yǔ)言中求兩個(gè)數(shù)的最大公約數(shù)是學(xué)習(xí)循環(huán)語(yǔ)句的非常經(jīng)典的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言求兩個(gè)正整數(shù)的最大公約數(shù)的相關(guān)資料,需要的朋友可以參考下2021-12-12C++運(yùn)算符重載 成員函數(shù)與友元函數(shù)詳解
以下是對(duì)C++運(yùn)算符重載 成員函數(shù)與友元函數(shù)進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下2013-07-07C++利用stringstream進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換實(shí)例
這篇文章主要介紹了C++利用stringstream進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換的方法,實(shí)例分析了使用stringstream進(jìn)行string轉(zhuǎn)int的操作技巧,需要的朋友可以參考下2015-01-01C++實(shí)現(xiàn)LeetCode(33.在旋轉(zhuǎn)有序數(shù)組中搜索)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(33.在旋轉(zhuǎn)有序數(shù)組中搜索),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07