另类色图亚洲色图_国产精品久久久久久久久久三级_日韩精品电影网站_久久中文字幕一区

當(dāng)前位置:首頁 ? 黑帽文章 ? 正文

黑帽seo排名技術(shù):快速排序的5種優(yōu)化方法

728 人參與  2021年12月02日 20:18  分類 : 黑帽文章  評論

三種快速排序以及快速排序的優(yōu)化

1、快速排序的基本思想:

   快速排序使用分治的思想,通過一趟排序?qū)⒋判蛄蟹指畛蓛刹糠?,其中一部分記錄的關(guān)鍵字均比另一部分記錄的關(guān)鍵字小。之后分別對這兩部分記錄繼續(xù)進(jìn)行排序,遞歸地以達(dá)到整個序列有序的目的。

2、快速排序的三個步驟:

(1)選擇基準(zhǔn):在待排序列中,按照某種方式挑出一個元素,作為 "基準(zhǔn)"(pivot)

(2)分割操作:以該基準(zhǔn)在序列中的實(shí)際位置,把序列分成兩個子序列。此時,在基準(zhǔn)左邊的元素都比該基準(zhǔn)小,在基準(zhǔn)右邊的元素都比基準(zhǔn)大

(3)遞歸地對兩個序列進(jìn)行快速排序,直到序列為空或者只有一個元素。

3、選擇基準(zhǔn)的方式

對于分治算法,當(dāng)每次劃分時,算法若都能分成兩個等長的子序列時,那么分治算法效率會達(dá)到最大。也就是說,基準(zhǔn)的選擇是很重要的。選擇基準(zhǔn)的方式?jīng)Q定了兩個分割后兩個子序列的長度,進(jìn)而對整個算法的效率產(chǎn)生決定性影響。

最理想的方法是,選擇的基準(zhǔn)恰好能把待排序序列分成兩個等長的子序列

我們介紹三種選擇基準(zhǔn)的方法

方法(1):固定位置(書本上介紹的內(nèi)容)

思想:取序列的第一個或最后一個元素作為基準(zhǔn)

基本的快速排序

int SelectPivot(int arr[],int low,int high){	return arr[low];//選擇選取序列的第一個元素作為基準(zhǔn)}

注意:基本的快速排序選取第一個或最后一個元素作為基準(zhǔn)。但不是一種好方法

測試數(shù)據(jù):

測試數(shù)據(jù)分析:如果輸入序列是隨機(jī)的,處理時間可以接受的。如果數(shù)組已經(jīng)有序時,此時的分割就是一個非常不好的分割。因為每次劃分只能使待排序序列減一,此時為最壞情況,快速排序淪為起泡排序,時間復(fù)雜度為Θ(n^2)。而且,輸入的數(shù)據(jù)是有序或部分有序的情況是相當(dāng)常見的。因此,使用第一個元素作為樞紐元是非常糟糕的,為了避免這個情況,就引入了下面兩個獲取基準(zhǔn)的方法。

方法(2):隨機(jī)選取基準(zhǔn)(不重要)

引入的原因:在待排序列是部分有序時,固定選取樞軸使快排效率底下,要緩解這種情況,就引入了隨機(jī)選取樞軸

思想:取待排序列中任意一個元素作為基準(zhǔn)

/*隨機(jī)選擇樞軸的位置,區(qū)間在low和high之間*/int SelectPivotRandom(int arr[],int low,int high){	srand((unsigned)time(NULL));//產(chǎn)生樞軸的位置	int pivotPos = rand()%(high - low) + low;	swap(arr[pivotPos],arr[low]);//把樞軸位置的元素和low位置元素互換,此時可以和普通的快排一樣調(diào)用劃分函數(shù)	return arr[low];}

方法(3):三數(shù)取中(median-of-three)(優(yōu)化有序的數(shù)據(jù))

引入的原因:雖然隨機(jī)選取樞軸時,減少出現(xiàn)不好分割的幾率,但是還是最壞情況下還是O(n^2),要緩解這種情況,就引入了三數(shù)取中選取樞軸

分析:最佳的劃分是將待排序的序列分成等長的子序列,最佳的狀態(tài)我們可以使用序列的中間的值,也就是第N/2個數(shù)??墒牵@很難算出來,并且會明顯減慢快速排序的速度。這樣的中值的估計可以通過隨機(jī)選取三個元素并用它們的中值作為樞紐元而得到。事實(shí)上,隨機(jī)性并沒有多大的幫助,因此一般的做法是使用左端、右端和中心位置上的三個元素的中值作為樞紐元。顯然使用三數(shù)中值分割法消除了預(yù)排序輸入的不好情形,并且減少快排大約14%的比較次數(shù)

舉例:待排序序列為:8 1 4 9 6 3 5 2 7 0

左邊為:8,右邊為0,中間為6.

我們這里取三個數(shù)排序后,中間那個數(shù)作為樞軸,則樞軸為6

注意:在選取中軸值時,可以從由左中右三個中選取擴(kuò)大到五個元素中或者更多元素中選取,一般的,會有(2t+1)平均分區(qū)法(median-of-(2t+1),三平均分區(qū)法英文為median-of-three)。

具體思想:對待排序序列中l(wèi)ow、mid、high三個位置上數(shù)據(jù)進(jìn)行排序,取他們中間的那個數(shù)據(jù)作為樞軸,并用0下標(biāo)元素存儲樞軸。

/*函數(shù)作用:取待排序序列中l(wèi)ow、mid、high三個位置上數(shù)據(jù),選取他們中間的那個數(shù)據(jù)作為樞軸*/
int SelectPivotMedianOfThree(int arr[],int low,int high)
{
	int mid = low + ((high - low) >> 1);//計算數(shù)組中間的元素的下標(biāo)
	//使用三數(shù)取中法選擇樞軸
 
	if (arr[mid] > arr[high])//目標(biāo): arr[mid] <= arr[high]
	{
		swap(arr[mid],arr[high]);
	}
 
	if (arr[low] > arr[high])//目標(biāo): arr[low] <= arr[high]
	{
		swap(arr[low],arr[high]);
	}
 
	if (arr[mid] > arr[low]) //目標(biāo): arr[low] >= arr[mid]
	{
		swap(arr[mid],arr[low]);
	}
 
	//此時,arr[mid] <= arr[low] <= arr[high]
	return arr[low];
	//low的位置上保存這三個位置中間的值
	//分割時可以直接使用low位置的元素作為樞軸,而不用改變分割函數(shù)了
}

測試數(shù)據(jù)分析:使用三數(shù)取中選擇樞軸優(yōu)勢還是很明顯的,但是還是處理不了重復(fù)數(shù)組

優(yōu)化1、采用三數(shù)取中法原則樞紐。

優(yōu)化2、當(dāng)待排序序列的長度分割到一定大小后,使用插入排序。

原因:對于很小和部分有序的數(shù)組,快排不如插排好。當(dāng)待排序序列的長度分割到一定大小后,繼續(xù)分割的效率比插入排序要差,此時可以使用插排而不是快排

截止范圍:待排序序列長度N = 10,雖然在5~20之間任一截止范圍都有可能產(chǎn)生類似的結(jié)果,這種做法也避免了一些有害的退化情形。摘自《數(shù)據(jù)結(jié)構(gòu)與算法分析》Mark Allen Weiness 著

if (high - low + 1 < 10)
{
	InsertSort(arr,low,high);
	return;
}//else時,正常執(zhí)行快排

測試數(shù)據(jù):

測試數(shù)據(jù)分析:針對隨機(jī)數(shù)組,使用三數(shù)取中選擇樞軸+插排,效率還是可以提高一點(diǎn),是針對已排序的數(shù)組,是沒有任何用處的。因為待排序序列是已經(jīng)有序的,那么每次劃分只能使待排序序列減一。此時,插排是發(fā)揮不了作用的。所以這里看不到時間的減少。另外,三數(shù)取中選擇樞軸+插排還是不能處理重復(fù)數(shù)組

優(yōu)化3、在一次分割結(jié)束后,可以把與Key相等的元素聚在一起,繼續(xù)下次分割時,不用再對與key相等元素分割

舉例:

待排序序列 1 4 6 7 6 6 7 6 8 6

三數(shù)取中選取樞軸:下標(biāo)為4的數(shù)6

轉(zhuǎn)換后,待分割序列:6 4 6 7 1 6 7 6 8 6

             樞軸key:6

本次劃分后,未對與key元素相等處理的結(jié)果:1 4 6 6 7 6 7 6 8 6

下次的兩個子序列為:1 4 6 和 7 6 7 6 8 6

本次劃分后,對與key元素相等處理的結(jié)果:1 4 6 6 6 6 6 7 8 7

下次的兩個子序列為:1 4 和 7 8 7

經(jīng)過對比,我們可以看出,在一次劃分后,把與key相等的元素聚在一起,能減少迭代次數(shù),效率會提高不少

具體過程:在處理過程中,會有兩個步驟

第一步,在劃分過程中,把與key相等元素放入數(shù)組的兩端

第二步,劃分結(jié)束后,把與key相等的元素移到樞軸周圍

舉例:

待排序序列 1 4 6 7 6 6 7 6 8 6

三數(shù)取中選取樞軸:下標(biāo)為4的數(shù)6

轉(zhuǎn)換后,待分割序列:6 4 6 7 1 6 7 6 8 6

             樞軸key:6

第一步,在劃分過程中,把與key相等元素放入數(shù)組的兩端 

結(jié)果為:6 4 1 6(樞軸) 7 8 7 6 6 6

此時,與6相等的元素全放入在兩端了

第二步,劃分結(jié)束后,把與key相等的元素移到樞軸周圍

結(jié)果為:1 4 66(樞軸)  6 6 6 7 8 7

此時,與6相等的元素全移到樞軸周圍了

之后,在1 4 和 7 8 7兩個子序列進(jìn)行快排

void gather(int arr[], int low, int high, int boundKey, int *left, int *right)
{
	if (low < high)
	{
		int count = boundKey - 1;
		for (int i = boundKey - 1; i >= low; --i)
		{
			if (arr[i] == arr[boundKey])
			{
				swap(arr, i, count);
				count--;
			}
		}
		*left = count;
		count = boundKey + 1;
		for (int i = boundKey + 1; i <= high; ++i)
		{
			if (arr[i] == arr[boundKey])
			{
				swap(arr, i, count);
				count++;
			}
		}
		*right = count;
	}
}

測試數(shù)據(jù):

測試數(shù)據(jù)分析:三數(shù)取中選擇樞軸+插排+聚集相等元素的組合,效果竟然好的出奇。

原因:在數(shù)組中,如果有相等的元素,那么就可以減少不少冗余的劃分。這點(diǎn)在重復(fù)數(shù)組中體現(xiàn)特別明顯啊。

其實(shí)這里,插排的作用還是不怎么大的。

優(yōu)化4:優(yōu)化遞歸操作(不重要)

快排函數(shù)在函數(shù)尾部有兩次遞歸操作,我們可以對其使用尾遞歸優(yōu)化

優(yōu)點(diǎn):如果待排序的序列劃分極端不平衡,遞歸的深度將趨近于n,而棧的大小是很有限的,每次遞歸調(diào)用都會耗費(fèi)一定的??臻g,函數(shù)的參數(shù)越多,每次遞歸耗費(fèi)的空間也越多。優(yōu)化后,可以縮減堆棧深度,由原來的O(n)縮減為O(logn),將會提高性能。

void QSort(int arr[],int low,int high)
{ 
	int pivotPos = -1;
	if (high - low + 1 < 10)
	{
		InsertSort(arr,low,high);
		return;
	}
	while(low < high)
	{
		pivotPos = Partition(arr,low,high);
		QSort(arr,low,pivot-1);
		low = pivot + 1;
	}
}

注意:在第一次遞歸后,low就沒用了,此時第二次遞歸可以使用循環(huán)代替

測試數(shù)據(jù):

測試數(shù)據(jù)分析:其實(shí)這種優(yōu)化編譯器會自己優(yōu)化,相比不使用優(yōu)化的方法,時間幾乎沒有減少

優(yōu)化5:使用并行或多線程處理子序列(略)

所有的數(shù)據(jù)測試:

概括:這里效率最好的快排組合 是:三數(shù)取中+插排+聚集相等元素,它和STL中的Sort函數(shù)效率差不多

注意:由于測試數(shù)據(jù)不穩(wěn)定,數(shù)據(jù)也僅僅反應(yīng)大概的情況。如果時間上沒有成倍的增加或減少,僅僅有小額變化的話,我們可以看成時間差不多?!就暾目炫艃?yōu)化后代碼要的可以私我哦~】


來源:黑帽工具網(wǎng)(/QQ號:25496334),轉(zhuǎn)載請保留出處和鏈接!

本文鏈接:http://m.sugarbabysoaps.com/fuzhuruanjian/1356.html

本站內(nèi)容來源于合作伙伴及網(wǎng)絡(luò)搜集,版權(quán)歸原作者所有。如有侵犯版權(quán),請立刻和本站聯(lián)系,我們將在三個工作日內(nèi)予以改正。

Copyright ?黑帽軟件網(wǎng) All Rights Reserved.

百度分享獲取地址:http://share.baidu.com/code

微信:heimaowiki

<< 上一篇下一篇 >>

  • 評論(0)
  • 贊助本站

◎歡迎參與討論,請在這里發(fā)表您的看法、交流您的觀點(diǎn)。

網(wǎng)站地圖 | 蜘蛛池出租 | 黑帽百科 百科論壇

Copyright Your 黑帽工具網(wǎng).Some Rights Reserved.

另类色图亚洲色图_国产精品久久久久久久久久三级_日韩精品电影网站_久久中文字幕一区
91久久久久久久| 欧美 日韩精品| 成人免费毛片网| 国产免费人做人爱午夜视频| 国内偷自视频区视频综合| 麻豆中文字幕在线观看| 国产区一区二区三区| 国产精品丝袜高跟| av在线观看地址| 久久久久久www| 久久久亚洲成人| 一区二区三区视频| 国产精品视频999| 色综合久久88色综合天天看泰| 国产精品日韩一区二区三区| 最新不卡av| 青青草国产精品视频| 国产在线视频一区| 91久久精品国产91性色| 久久精品二区| 欧美极品欧美精品欧美视频| 日日碰狠狠丁香久燥| 国产日韩一区欧美| 日韩综合视频在线观看| 久久99久久99精品中文字幕| 日本精品一区二区三区不卡无字幕 | 日韩不卡一二区| 精品少妇人妻av免费久久洗澡| 国产在线观看91精品一区| 国产精品99久久久久久久| 国产精品久久久久久婷婷天堂| 懂色av粉嫩av蜜臀av| 精品少妇人妻av一区二区| 久久久久久久久久久人体| 亚洲欧美影院| 国产欧美日韩中文字幕| 久久精品一本久久99精品| 亚洲精品欧洲精品| 国产一区二区三区av在线| 日韩一区二区久久久| 亚洲 日韩 国产第一区| 成人久久精品视频| 欧美激情精品久久久| 国产在线精品一区二区三区| 国产精品区一区二区三在线播放| 茄子视频成人免费观看| 精品久久久91| 蜜桃成人在线| 精品丰满人妻无套内射| 国产伦精品一区二区三区精品视频| 国产精品久久久久久久久免费看| 欧美牲交a欧美牲交aⅴ免费下载 | 久久天天躁狠狠躁夜夜躁2014| 欧美一区二区三区……| 不卡伊人av在线播放| 免费观看美女裸体网站| 国产精品旅馆在线| 国产精品一区二区三区免费视频| 欧美精品手机在线| www.日本少妇| 欧美一乱一性一交一视频| 91精品国产色综合| 日本www在线视频| 国产精品三级网站| 精品999在线观看| 国产精品高潮呻吟久久av无限 | 日韩最新在线视频| 久久久久久噜噜噜久久久精品| 在线视频亚洲自拍| 久久精品五月婷婷| 黄色一级片网址| 一区二区三区电影| 日韩一区二区av| 国产欧美亚洲精品| 日韩成人在线资源| 久久久99久久精品女同性| 国产一区二区免费在线观看| 宅男一区二区三区| www.欧美精品一二三区| 国产欧美 在线欧美| 亚洲福利av在线| 国产精品久久久影院| 97精品一区二区视频在线观看| 日韩精品久久一区二区| 九九综合九九综合| 日韩有码在线播放| 粉嫩av一区二区三区免费观看| 日本不卡二区| 亚洲五月六月| 国产精品国产福利国产秒拍| 成人精品一区二区三区电影免费| 日本不卡一区| 亚洲欧美日韩不卡| 欧美精品一二区| 国产精品无码一区二区在线| 国产成人亚洲欧美| av网址在线观看免费| 国产午夜福利在线播放| 欧日韩免费视频| 日韩免费在线播放| 日本一区二区在线免费播放| 亚洲精品中文字幕乱码三区不卡| 欧美成人一二三| 久久人人爽亚洲精品天堂| 91精品一区二区三区四区| 国产资源在线视频| 欧美在线一级va免费观看| 日韩女优在线播放| 日韩精品免费播放| 日本中文字幕在线视频观看| 亚洲国产精品久久久久婷婷老年| 美女国内精品自产拍在线播放| 国产精品久久国产精品99gif| 日韩综合中文字幕| 色妞一区二区三区| 久久久久中文字幕| 日韩在线视频线视频免费网站| 久久综合婷婷综合| 国产成人永久免费视频| 久久精品国产综合精品| 久久久视频在线| 久久久99精品视频| 久操网在线观看| 久久精品国产亚洲精品| 精品激情国产视频| 久久中国妇女中文字幕| 久久福利视频网| 久久国产视频网站| 亚洲综合中文字幕在线| 天堂av在线中文| 欧美二区三区| 国产精品一区二区三区成人 | 久久999免费视频| 欧美日韩成人在线观看| 亚洲激情电影在线| 日韩免费一区二区三区| 国产在线高清精品| 久久久亚洲天堂| 国产精品久久久影院| 综合操久久久| 日韩欧美精品一区二区三区经典| 欧美激情第一页在线观看| 国产美女精品在线观看| 国产精品50p| 久久精品国产成人精品| 宅男av一区二区三区| 秋霞成人午夜鲁丝一区二区三区| 精品一区二区中文字幕| 国产噜噜噜噜久久久久久久久 | 中文网丁香综合网| 日韩免费一区二区三区| 粉嫩av免费一区二区三区| 日韩中文字幕国产| 午夜免费福利小电影| 免费在线观看一区二区| 国产精品99久久久久久久久| 国产精品久久久久久久电影| 亚洲a在线观看| 蜜桃网站成人| 久久久久久久久影视| 一区二区高清视频| 国产自产精品| 国产精品无码乱伦| 日本久久亚洲电影| 91麻豆蜜桃| 九九热精品在线| 欧美二区在线视频| 色狠狠av一区二区三区香蕉蜜桃| 欧美激情亚洲综合一区 | 国产成人精品综合久久久| 亚洲一区二区三区精品视频 | 91精品国产高清自在线看超| 日韩在线高清视频| 国产日韩精品久久| 日韩aⅴ视频一区二区三区| 久久99精品久久久久久琪琪| 精品国产一区二区三区久久| 久久国产午夜精品理论片最新版本 | 亚洲激情电影在线| 国产精品成人观看视频免费 | 久久国产精品精品国产色婷婷| 97人人模人人爽人人喊38tv| 国产精品又粗又长| 国产裸体免费无遮挡| 国产精品一区二区电影| 国产欧美精品在线| 国产精品一区二区三区四区五区| 国产美女91呻吟求| 波多野结衣久草一区| 97免费高清电视剧观看| 免费在线观看的毛片| 国语自产精品视频在线看一大j8| 欧美精品一区二区三区三州| 欧美在线观看网址综合| 欧美日韩视频在线一区二区观看视频| 秋霞午夜一区二区| 黄色一级免费大片| 亚洲色精品三区二区一区| 日韩中文字幕一区二区| 欧洲熟妇精品视频|