YOUJIZZ中国少妇_99精产国品一二三产区区_男男gv在线观看_久久99精品久久久久婷婷_国产成人无码AV片在线观看不卡_曰本女人牲交视频视频免费_久久久无码人妻精品无码 _亚洲AV熟女高潮30P_久久国产精品香蕉成人APP

當前位置:首頁 ? 黑帽文章 ? 正文

黑帽seo排名技術:快速排序的5種優化方法

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

三種快速排序以及快速排序的優化

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

   快速排序使用分治的思想,通過一趟排序將待排序列分割成兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小。之后分別對這兩部分記錄繼續進行排序,遞歸地以達到整個序列有序的目的。

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

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

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

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

3、選擇基準的方式

對于分治算法,當每次劃分時,算法若都能分成兩個等長的子序列時,那么分治算法效率會達到最大。也就是說,基準的選擇是很重要的。選擇基準的方式決定了兩個分割后兩個子序列的長度,進而對整個算法的效率產生決定性影響。

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

我們介紹三種選擇基準的方法

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

思想:取序列的第一個或最后一個元素作為基準

基本的快速排序

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

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

測試數據:

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

方法(2):隨機選取基準(不重要)

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

思想:取待排序列中任意一個元素作為基準

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

方法(3):三數取中(median-of-three)(優化有序的數據)

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

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

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

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

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

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

具體思想:對待排序序列中low、mid、high三個位置上數據進行排序,取他們中間的那個數據作為樞軸,并用0下標元素存儲樞軸。

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

測試數據分析:使用三數取中選擇樞軸優勢還是很明顯的,但是還是處理不了重復數組

優化1、采用三數取中法原則樞紐。

優化2、當待排序序列的長度分割到一定大小后,使用插入排序。

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

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

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

測試數據:

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

優化3、在一次分割結束后,可以把與Key相等的元素聚在一起,繼續下次分割時,不用再對與key相等元素分割

舉例:

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

三數取中選取樞軸:下標為4的數6

轉換后,待分割序列:6 4 6 7 1 6 7 6 8 6

             樞軸key:6

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

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

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

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

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

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

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

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

舉例:

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

三數取中選取樞軸:下標為4的數6

轉換后,待分割序列:6 4 6 7 1 6 7 6 8 6

             樞軸key:6

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

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

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

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

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

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

之后,在1 4 和 7 8 7兩個子序列進行快排

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;
	}
}

測試數據:

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

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

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

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

快排函數在函數尾部有兩次遞歸操作,我們可以對其使用尾遞歸優化

優點:如果待排序的序列劃分極端不平衡,遞歸的深度將趨近于n,而棧的大小是很有限的,每次遞歸調用都會耗費一定的??臻g,函數的參數越多,每次遞歸耗費的空間也越多。優化后,可以縮減堆棧深度,由原來的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就沒用了,此時第二次遞歸可以使用循環代替

測試數據:

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

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

所有的數據測試:

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

注意:由于測試數據不穩定,數據也僅僅反應大概的情況。如果時間上沒有成倍的增加或減少,僅僅有小額變化的話,我們可以看成時間差不多?!就暾目炫艃灮蟠a要的可以私我哦~】


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

本文鏈接:http://www.dtflighting.com/fuzhuruanjian/1356.html

本站內容來源于合作伙伴及網絡搜集,版權歸原作者所有。如有侵犯版權,請立刻和本站聯系,我們將在三個工作日內予以改正。

Copyright ?黑帽軟件網 All Rights Reserved.

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

微信:heimaowiki

<< 上一篇下一篇 >>

  • 評論(0)
  • 贊助本站

◎歡迎參與討論,請在這里發表您的看法、交流您的觀點。

網站地圖 | 蜘蛛池出租 | 黑帽百科 百科論壇

Copyright Your 黑帽工具網.Some Rights Reserved.

亚洲丰满熟妇乱XXXXX网站| 色翁荡熄又大又硬又粗又视频 | 久久精品熟女亚州AV麻豆| 精品无码久久久久国产| 隔着衣服吃你的小尖尖作文| 国产精品第一区揄拍无码| 国精产品一区二区三区有限| 精品国内在视频线2019| 没带罩子让他吃了一天药会怎样 | 国产精品亚洲АV无码播放| 国产午夜福利在线播放| 精品人妻A∨一区二区夫上司犯| 久久亚洲色WWW成人欧美| 欧美丰满熟妇BBBBBB性亚洲| 日韩人妻无码一区二区三区视频| 无码人妻丰满熟妇区免费| 亚洲成AV人片在线观看| 曰本丰满熟妇XXXX性| WWW.一区二区三区在线 || 丰满人妻一区二区三区视频53 | JESSICAJAMES护士性| 国产AⅤ激情无码久久男男剧| 国产综合久久久久| 旅人蕉天堂鸟的区别视频| 人妻少妇久久中文字幕| 无码人妻束缚av又粗又大| 亚洲中字幕日产2021草莓 | 黑人双人RAPPER的特点| 鲁一鲁一鲁一鲁一曰综合网| 日韩AV影院在线观看| 亚洲AV无码不卡国产精品| 中文字幕人妻丝袜乱一区三区| 穿越后每天都在PIAPIA打脸| 狠狠色综合网站久久久久久久| 免费午夜无码18禁无码影视| 少妇与子乱A级全毛片| 亚洲乱色伦图片区小说| A亚洲VA欧美VA国产综合 | 日本三级黄色视频| 亚洲AV无码一区二区三区久久精| 中文字幕AⅤ人妻一区二区| 丰满的少妇愉情HD高清免费| 久久国产一区二区三区| 人妻体内射精一区二区三四 | 国产SM调教视频在线观看| 精品亚洲AⅤ无码一区二区三区| 欧美交换配乱吟粗大和黄| 无码专区天天躁天天躁在线| 中文字日产幕码三区的做法步| 国产成人剧情AV麻豆果冻| 久久久噜噜噜久久熟女| 日韩中文高清在线专区| 亚洲一级 片内射无码| 成人午夜免费无码福利片| 久久99精品久久久久久秒播| 日产乱码一二三区别免费下| 亚洲中文字幕无码AV| 高潮VIDEOSSEX潮喷另类| 兰姨不敢发出一点声音怕吵醒风| 特级毛片A级毛片免费观看网站| 永久免费AV无码网站韩国毛片| 伽罗ちゃんが腿法| 老熟妇仑乱一区二区视頻| 舔吮着她的乳尖小说| …久久精品99久久香蕉国产| 国产亚洲精品精品国产亚洲综合| 亲孑伦视频一区二区三区视频| 亚洲成A人片在线观看天堂无码不| 波多野结衣乳巨码无在线观看| 久久精品日日躁夜夜躁欧美| 天天躁狠狠躁狠狠躁夜夜躁| 7777成年免费视频| 黄 色 视 频 在 线 免费观| 色一情一乱一乱一区91Av奶水 | 一出一进一爽一粗一大视频免费的| 父母儿女一家换着玩的句子| 男人激烈吮乳吃奶视频免费| 亚洲の无码国产の无码影院| 丰满人爽人妻AXXXXHD| 毛茸茸性XXXX毛茸茸毛茸茸| 亚洲AV永久一区二区三区蜜桃| 大伊香蕉精品视频在线天堂| 蜜臀亚洲AV无码精品国产午夜.| 亚洲AV无码国产一区二区三区不 | 肉大捧一进一出免费视频| 午夜精品一区二区三区在线观看| 亚洲 欧洲 小说 自拍| 扒开腿挺进湿润的花苞| 久久久久女人精品毛片| 下面饿了想吃大香肠| 被老外添嫩苞添高潮NP视频| 蜜桃亚洲AV无码一区二区三区| 亚洲AV永久天码精品天堂DL| 高一数学网课免费-2| 啪啪叉叉xx高清无码| 在线欧美精品一区二区三区 | 亚洲中文字幕久在线| 国产色婷婷五月精品综合在线 | 日本午夜免费福利视频 | 雨后小故事完整版| 京东天美麻豆果冻传媒| 无码被窝影院午夜看片爽爽JK| 成年无码AV片完整版| 内射人妻无码色AV无码| 夜夜夜高潮夜夜爽夜夜爰爰| 好男人好资源电影在线播放| 五级黄高潮片90分钟视频| 大香伊蕉在人线国产最新75| 青青草无码精品伊人久久| 岳胀耸的雪乳奶水| 久久精品久久精品中文字幕| 亚洲AV永久无码精品主页丝瓜 | 一区三区四区产品乱码| 狠狠色丁香久久婷婷综合五月 | 娇小的学生BBW18| 性高朝久久久久久久3小时| 丰满老熟好大BBB| 日本无遮挡吸乳视频| 爱丫爱丫影院电视剧| 女人收缩时男人舒服吗| 又粗又黄又爽视频免费看| 久久久久噜噜噜亚洲熟女综合| 亚洲成A人片在线观看天堂无码不| 国产全肉乱妇杂乱视频| 无码精品人妻一区二区三区影院| 成人片黄网站色大片免费观看CN | 奶头被客人玩的又红又肿| 伊人色综合一区二区三区影院视频| 久久国产精品久久久久久| 亚洲国产精华推荐单单品榜| 国内揄拍国内精品人妻浪潮AV| 性极强的岳让我满足| 国产日产欧产美韩系列| 学长别揉了~流水了想要~ | 免费人成在线观看网站免费观看| 永久免费精品精品永久-夜色 | 老子影院午夜精品无码| 曰曰摸天天添天天湿| 美女床上喷水在线观看| 51国产偷自视频区视频| 欧美精品九九99久久在免费线| 99国精产品灬源码1| 欧美精品18VIDEOS性欧美| JAPANESEⅩⅩⅩHD69| 人人澡人人人妻人人人少妇| 成年动作片AV免费网站| 少妇极品熟妇人妻| 国产成人无码午夜视频在线观看| 无码99久热只有精品视频在线观| 国产日产亚洲系列最新| 亚洲AV无码一级毛片少妇| 精品少妇人妻AV一区二区| 亚洲伊人久久综合成人| 蜜臀av色欲一区二区三区麻豆 | 日韩成人精品久久网站| 俄罗斯卖CSGO的网站免费进入| 挺进朋友人妻的身体里| 国产亚洲AV浪潮A∨尹人Av| 亚洲国产精品成人网址天堂 | 久久亚洲欧美国产精品| 中中文日产幕无线码一区| 欧洲美熟女乱又伦AV影片| 丰满的少妇XXXXX人妻| 无码人妻av免费一区二区三区| 国产亚洲日韩欧美另类丝瓜APP| 亚洲人成色777777网站| 免费精品99久久国产综合精品| VR成品在线网站| 国内精品久久久久久久影院 | 凸凹人妻人人澡人人添| 国产精品亚洲二区在线观看| 亚洲VA久久久噜噜噜熟女8| 久久精品国产只有精品66| 中文字幕亚洲综合久久综合| 人妻中出受孕 中文字幕在线| 国产97在线 | 亚洲| 亚洲AV永久无码精品网站在线观 | 孩子玩着玩着就进去了怎么回事| 野花香电视剧全集免费观看| 激情内射人妻1区2区3区| 亚洲中文字幕久久久一区| 拧花蒂尿用力按凸起喷水尿视频| 成人区人妻精品一区二| 亚欧成人中文字幕一区| 久久久国产精华液| FREE性玩弄少妇HD性老妇| 天堂AV亚洲ITV在线AⅤ| 精品亚洲国产成人蜜臀优播AV| 69国产成人综合久久精品| 视频在线一区二区三区| 娇小VIDEOS出血| JAPANESETUBE日本X| 无码AV在线一本无码| 久久天天躁狠狠躁夜夜爽| 被黑人伦流澡到高潮HNP动漫| 亚洲AV成人无码一二三在线观看| 没带罩子让他吃了一天药会怎样 | 在教室伦流澡到高潮H强圩电影| 亚洲AV无码成人精品区欧洲| 欧美黑人又粗又大又爽免费|