最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++快速排序算法簡明理解

 更新時間:2022年05月27日 08:57:03   作者:m78星云杰克  
快速排序由于排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經(jīng)常被采用,再加上快速排序思想----分治法也確實(shí)實(shí)用,因此很多軟件公司的筆試面試,包括像騰訊,微軟等知名IT公司都喜歡考這個,還有大大小的程序方面的考試如軟考,考研中也常常出現(xiàn)快速排序的身影

一、問題描述

[問題] 應(yīng)用快速排序方法對一個記錄序列進(jìn)行升序排列??焖倥判?quick sort)的分治策略如下。

(1)劃分:選定一個記錄作為軸值,以軸值為基準(zhǔn)將整個序列劃分為兩個子序列r(1)… r(i-1))和r(i+1)…r(n),軸值的位置i在劃分的過程中確定,并且前一個子序列中的記錄均小于或等于軸值,后一個子序列中的記錄均大于或等于軸值;

(2)求解子問題:分別對劃分后的每一個子序列造歸處理;

(3)合并:由于子序列排序是就地進(jìn)行的,所以合并不需要任何操作。

二、想法

[想法] 首先對待 排序記錄序列進(jìn)行劃分,劃分的軸值應(yīng)該遵循平衡子問題的原則,使劃分后的兩個子序列的長度盡量相等,這是決定快速排序算法時間性能的關(guān)鍵。軸值的選擇有很多方法,例如,可以隨機(jī)選出一個記錄作為軸值,從而期望劃分是較平衡的。

第一次劃分過程:

后續(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])    //對右側(cè)掃描,即r[i] 與右側(cè)的r[j...i+1]比較,升序排序,如果有小于r[i]的值,即右小于左則跳出循環(huán),還有i>=j也跳出循環(huán),即比較完,沒有比它小的,必須兩個條件同時滿足。
			j--;
		if(i<j) {      //在i<j的情況下滿足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])//對左側(cè)掃描,即r[j] 與左側(cè)的r[i...j-1]比較,升序排序,如果有大于r[j]的值,即左側(cè)值大于右側(cè)值則跳出循環(huán),還有i>=j也跳出循環(huán),即比較完,沒有比它大的,必須兩個條件同時滿足。
		i++;
	if(i<j) {    //在i<j的情況下滿足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);      //對軸值左側(cè)遞歸
		Quicksort(r,pivot+1,end);		//對軸值右側(cè)遞歸
	}
}

總結(jié)

快速排序是眾多排序方法中,較為重要的一種,它在排序算法中具有排序速度快,而且是就地排序等優(yōu)點(diǎn),使得在許多編程語言的內(nèi)部元素排序?qū)崿F(xiàn)中采用的就是快速排序,很多面試題中也經(jīng)常遇到。

到此這篇關(guān)于C++快速排序算法簡明理解的文章就介紹到這了,更多相關(guān)C++快速排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++使用GDAL庫實(shí)現(xiàn)Tiff文件的讀取

    C++使用GDAL庫實(shí)現(xiàn)Tiff文件的讀取

    這篇文章主要為大家詳細(xì)介紹了C++使用GDAL庫實(shí)現(xiàn)Tiff文件的讀取的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • c++虛函數(shù)與虛函數(shù)表原理

    c++虛函數(shù)與虛函數(shù)表原理

    這篇文章主要介紹了c++虛函數(shù)與虛函數(shù)表原理,用virtual?修飾的成員函數(shù)叫虛函數(shù),下面圍繞c++虛函數(shù)與虛函數(shù)得相關(guān)資料展開內(nèi)容,需要的朋友可以參考一下
    2021-12-12
  • 基于C語言實(shí)現(xiàn)的迷宮游戲代碼

    基于C語言實(shí)現(xiàn)的迷宮游戲代碼

    這篇文章主要介紹了基于C語言實(shí)現(xiàn)的迷宮游戲代碼,對于學(xué)習(xí)游戲開發(fā)的朋友相信有一定的借鑒價值,需要的朋友可以參考下
    2014-08-08
  • C++?中如何結(jié)束?while?(cin>>str)?的輸入

    C++?中如何結(jié)束?while?(cin>>str)?的輸入

    這篇文章主要介紹了C++?中如何結(jié)束?while?(cin>>str)?的輸入,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語言經(jīng)典算法例題求100-999之間的“水仙花數(shù)”

    C語言經(jīng)典算法例題求100-999之間的“水仙花數(shù)”

    本文的主要內(nèi)容,設(shè)計一個程序,找出100-999之間的“水仙花數(shù)”,需要的朋友可以參考下
    2015-07-07
  • C++實(shí)現(xiàn)合并排序的方法

    C++實(shí)現(xiàn)合并排序的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)合并排序的方法,實(shí)例分析了合并排序的原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-07-07
  • Qt如何自定義滑動條

    Qt如何自定義滑動條

    這篇文章主要介紹了Qt如何自定義滑動條問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 常用的C語言排序算法(兩種)

    常用的C語言排序算法(兩種)

    本文給大家分享兩種常用的C語言排序算法,代碼非常簡單,感興趣的朋友可以參考下
    2016-09-09
  • C語言實(shí)現(xiàn)黎曼和求定積分

    C語言實(shí)現(xiàn)黎曼和求定積分

    這篇文章主要為大家詳細(xì)介紹了用C語言程序?qū)崿F(xiàn)黎曼和求定積分,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 如何使用visual studio2019創(chuàng)建簡單的MFC窗口(使用C++)

    如何使用visual studio2019創(chuàng)建簡單的MFC窗口(使用C++)

    這篇文章主要介紹了如何使用visual studio2019創(chuàng)建簡單的MFC窗口(使用C++),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03

最新評論

永昌县| 岳西县| 二连浩特市| 宣汉县| 义马市| 梁河县| 京山县| 安康市| 霍城县| 米脂县| 林口县| 靖州| 柳河县| 阳泉市| 专栏| 荣昌县| 六盘水市| 西宁市| 吴堡县| 新源县| 社会| 桐城市| 尚义县| 临西县| 古田县| 富裕县| 呼伦贝尔市| 崇仁县| 曲水县| 宣武区| 崇礼县| 奉贤区| 阳信县| 辽中县| 格尔木市| 安平县| 梅州市| 沈丘县| 视频| 东明县| 平乐县|