-
當(dāng)前位置:首頁(yè) > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
1、排序算法概述
nlogn的排序(nlogn的排序口訣)
大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于nlogn的排序的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。
開(kāi)始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫(xiě)出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請(qǐng)撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、排序算法概述
十大排序算法:冒泡排序,選擇排序,插入排序,歸并排序,堆排序,快速排序、希爾排序、計(jì)數(shù)排序,基數(shù)排序,桶排序
穩(wěn)定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
不穩(wěn)定 :如果a原本在b的前面,而a=b,排序之后a可能會(huì)出現(xiàn)在b的后面;
排序算法如果是穩(wěn)定的,那么從一個(gè)鍵上排序,然后再?gòu)牧硪粋€(gè)鍵上排序,前一個(gè)鍵排序的結(jié)果可以為后一個(gè)鍵排序所用。
算法的復(fù)雜度往往取決于數(shù)據(jù)的規(guī)模大小和數(shù)據(jù)本身分布性質(zhì)。
時(shí)間復(fù)雜度 : 一個(gè)算法執(zhí)行所耗費(fèi)的時(shí)間。
空間復(fù)雜度 :對(duì)一個(gè)算法在運(yùn)行過(guò)程中臨時(shí)占用存儲(chǔ)空間大小的量度。
常見(jiàn)復(fù)雜度由小到大 :O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)
在各種不同算法中,若算法中語(yǔ)句執(zhí)行次數(shù)(占用空間)為一個(gè)常數(shù),則復(fù)雜度為O(1);
當(dāng)一個(gè)算法的復(fù)雜度與以2為底的n的對(duì)數(shù)成正比時(shí),可表示為O(log n);
當(dāng)一個(gè)算法的復(fù)雜度與n成線性比例關(guān)系時(shí),可表示為O (n),依次類推。
冒泡、選擇、插入排序需要兩個(gè)for循環(huán),每次只關(guān)注一個(gè)元素,平均時(shí)間復(fù)雜度為
(一遍找元素O(n),一遍找位置O(n))
快速、歸并、堆基于分治思想,log以2為底,平均時(shí)間復(fù)雜度往往和O(nlogn)(一遍找元素O(n),一遍找位置O(logn))相關(guān)
而希爾排序依賴于所取增量序列的性質(zhì),但是到目前為止還沒(méi)有一個(gè)最好的增量序列 。例如希爾增量序列時(shí)間復(fù)雜度為O(n²),而Hibbard增量序列的希爾排序的時(shí)間復(fù)雜度為 , 有人在大量的實(shí)驗(yàn)后得出結(jié)論;當(dāng)n在某個(gè)特定的范圍后希爾排序的最小時(shí)間復(fù)雜度大約為n^1.3。
從平均時(shí)間來(lái)看,快速排序是效率最高的:
快速排序中平均時(shí)間復(fù)雜度O(nlog n),這個(gè)公式中隱含的常數(shù)因子很小,比歸并排序的O(nlog n)中的要小很多,所以大多數(shù)情況下,快速排序總是優(yōu)于合并排序的。
而堆排序的平均時(shí)間復(fù)雜度也是O(nlog n),但是堆排序存在著重建堆的過(guò)程,它把根節(jié)點(diǎn)移除后,把最后的葉子結(jié)點(diǎn)拿上來(lái)后需要重建堆,但是,拿上的值是要比它的兩個(gè)葉子結(jié)點(diǎn)要差很多的,一般要比較很多次,才能回到合適的位置。堆排序就會(huì)有很多的時(shí)間耗在堆調(diào)整上。
雖然快速排序的最壞情況為排序規(guī)模(n)的平方關(guān)系,但是這種最壞情況取決于每次選擇的基準(zhǔn), 對(duì)于這種情況,已經(jīng)提出了很多優(yōu)化的方法,比如三取樣劃分和Dual-Pivot快排。
同時(shí),當(dāng)排序規(guī)模較小時(shí),劃分的平衡性容易被打破,而且頻繁的方法調(diào)用超過(guò)了O(nlog n)為
省出的時(shí)間,所以一般排序規(guī)模較小時(shí),會(huì)改用插入排序或者其他排序算法。
一種簡(jiǎn)單的排序算法。它反復(fù)地走訪過(guò)要排序的數(shù)列,一次比較兩個(gè)元素,如果它們的順序錯(cuò)誤就把它們交換過(guò)來(lái)。這個(gè)工作重復(fù)地進(jìn)行直到?jīng)]有元素再需要交換,也就是說(shuō)該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來(lái)是因?yàn)樵貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端。
1.從數(shù)組頭開(kāi)始,比較相鄰的元素。如果第一個(gè)比第二個(gè)大(小),就交換它們兩個(gè);
2.對(duì)每一對(duì)相鄰元素作同樣的工作,從開(kāi)始第一對(duì)到尾部的最后一對(duì),這樣在最后的元素應(yīng)該會(huì)是最大(小)的數(shù);
3.重復(fù)步驟1~2,重復(fù)次數(shù)等于數(shù)組的長(zhǎng)度,直到排序完成。
首先,找到數(shù)組中最大(?。┑哪莻€(gè)元素;
其次,將它和數(shù)組的第一個(gè)元素交換位置(如果第一個(gè)元素就是最大(?。┰啬敲此秃妥约航粨Q);
再次,在剩下的元素中找到最大(?。┑脑?,將它與數(shù)組的第二個(gè)元素交換位置。如此往復(fù),直到將整個(gè)數(shù)組排序。
這種方法叫做選擇排序,因?yàn)樗诓粩嗟剡x擇剩余元素之中的最大(?。┱?。
對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。
為了給要插入的元素騰出空間,我們需要將插入位置之后的已排序元素在都向后移動(dòng)一位。
插入排序所需的時(shí)間取決于輸入中元素的初始順序。例如,對(duì)一個(gè)很大且其中的元素已經(jīng)有序(或接近有序)的數(shù)組進(jìn)行排序?qū)?huì)比對(duì)隨機(jī)順序的數(shù)組或是逆序數(shù)組進(jìn)行排序要快得多。
總的來(lái)說(shuō),插入排序?qū)τ诓糠钟行虻臄?shù)組十分高效,也很適合小規(guī)模數(shù)組。
一種基于插入排序的快速的排序算法。簡(jiǎn)單插入排序?qū)τ诖笠?guī)模亂序數(shù)組很慢,因?yàn)樵刂荒芤稽c(diǎn)一點(diǎn)地從數(shù)組的一端移動(dòng)到另一端。例如,如果主鍵最小的元素正好在數(shù)組的盡頭,要將它挪到正確的位置就需要N-1 次移動(dòng)。
希爾排序?yàn)榱思涌焖俣群?jiǎn)單地改進(jìn)了插入排序,也稱為縮小增量排序,同時(shí)該算法是突破O(n^2)的第一批算法之一。
希爾排序是把待排序數(shù)組按一定數(shù)量的分組,對(duì)每組使用直接插入排序算法排序;然后縮小數(shù)量繼續(xù)分組排序,隨著數(shù)量逐漸減少,每組包含的元素越來(lái)越多,當(dāng)數(shù)量減至 1 時(shí),整個(gè)數(shù)組恰被分成一組,排序便完成了。這個(gè)不斷縮小的數(shù)量,就構(gòu)成了一個(gè)增量序列。
在先前較大的增量下每個(gè)子序列的規(guī)模都不大,用直接插入排序效率都較高,盡管在隨后的增量遞減分組中子序列越來(lái)越大,由于整個(gè)序列的有序性也越來(lái)越明顯,則排序效率依然較高。
從理論上說(shuō),只要一個(gè)數(shù)組是遞減的,并且最后一個(gè)值是1,都可以作為增量序列使用。有沒(méi)有一個(gè)步長(zhǎng)序列,使得排序過(guò)程中所需的比較和移動(dòng)次數(shù)相對(duì)較少,并且無(wú)論待排序列記錄數(shù)有多少,算法的時(shí)間復(fù)雜度都能漸近最佳呢?但是目前從數(shù)學(xué)上來(lái)說(shuō),無(wú)法證明某個(gè)序列是“最好的”。
常用的增量序列
希爾增量序列 :{N/2, (N / 2)/2, ..., 1},其中N為原始數(shù)組的長(zhǎng)度,這是最常用的序列,但卻不是最好的
Hibbard序列:{2^k-1, ..., 3,1}
Sedgewick序列:{... , 109 , 41 , 19 , 5,1} 表達(dá)式為
歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法的一個(gè)非常典型的應(yīng)用。
對(duì)于給定的一組數(shù)據(jù),利用遞歸與分治技術(shù)將數(shù)據(jù)序列劃分成為越來(lái)越小的半子表,在對(duì)半子表排序后,再用遞歸方法將排好序的半子表合并成為越來(lái)越大的有序序列。
為了提升性能,有時(shí)我們?cè)诎胱颖淼膫€(gè)數(shù)小于某個(gè)數(shù)(比如15)的情況下,對(duì)半子表的排序采用其他排序算法,比如插入排序。
若將兩個(gè)有序表合并成一個(gè)有序表,稱為2-路歸并,與之對(duì)應(yīng)的還有多路歸并。
快速排序(Quicksort)是對(duì)冒泡排序的一種改進(jìn),也是采用分治法的一個(gè)典型的應(yīng)用。
首先任意選取一個(gè)數(shù)據(jù)(比如數(shù)組的第一個(gè)數(shù))作為關(guān)鍵數(shù)據(jù),我們稱為基準(zhǔn)數(shù)(Pivot),然后將所有比它小的數(shù)都放到它前面,所有比它大的數(shù)都放到它后面,這個(gè)過(guò)程稱為一趟快速排序,也稱為分區(qū)(partition)操作。
通過(guò)一趟快速排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過(guò)程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)組變成有序序列。
為了提升性能,有時(shí)我們?cè)诜指詈螵?dú)立的兩部分的個(gè)數(shù)小于某個(gè)數(shù)(比如15)的情況下,會(huì)采用其他排序算法,比如插入排序。
基準(zhǔn)的選?。鹤顑?yōu)的情況是基準(zhǔn)值剛好取在無(wú)序區(qū)數(shù)值的中位數(shù),這樣能夠最大效率地讓兩邊排序,同時(shí)最大地減少遞歸劃分的次數(shù),但是一般很難做到最優(yōu)。基準(zhǔn)的選取一般有三種方式,選取數(shù)組的第一個(gè)元素,選取數(shù)組的最后一個(gè)元素,以及選取第一個(gè)、最后一個(gè)以及中間的元素的中位數(shù)(如4 5 6 7, 第一個(gè)4, 最后一個(gè)7, 中間的為5, 這三個(gè)數(shù)的中位數(shù)為5, 所以選擇5作為基準(zhǔn))。
Dual-Pivot快排:雙基準(zhǔn)快速排序算法,其實(shí)就是用兩個(gè)基準(zhǔn)數(shù), 把整個(gè)數(shù)組分成三份來(lái)進(jìn)行快速排序,在這種新的算法下面,比經(jīng)典快排從實(shí)驗(yàn)來(lái)看節(jié)省了10%的時(shí)間。
許多應(yīng)用程序都需要處理有序的元素,但不一定要求他們?nèi)坑行?,或者不一定要一次就將他們排序,很多時(shí)候,我們每次只需要操作數(shù)據(jù)中的最大元素(最小元素),那么有一種基于二叉堆的數(shù)據(jù)結(jié)構(gòu)可以提供支持。
所謂二叉堆,是一個(gè)完全二叉樹(shù)的結(jié)構(gòu),同時(shí)滿足堆的性質(zhì):即子結(jié)點(diǎn)的鍵值或索引總是小于(或者大于)它的父節(jié)點(diǎn)。在一個(gè)二叉堆中,根節(jié)點(diǎn)總是最大(或者最小)節(jié)點(diǎn)。
堆排序算法就是抓住了這一特點(diǎn),每次都取堆頂?shù)脑?,然后將剩余的元素重新調(diào)整為最大(最小)堆,依次類推,最終得到排序的序列。
推論1:對(duì)于位置為K的結(jié)點(diǎn) 左子結(jié)點(diǎn)=2 k+1 右子結(jié)點(diǎn)=2 (k+1)
驗(yàn)證:C:2 2 2+1=5 2 (2+1)=6
推論2:最后一個(gè)非葉節(jié)點(diǎn)的位置為 (N/2)-1,N為數(shù)組長(zhǎng)度。
驗(yàn)證:數(shù)組長(zhǎng)度為6,(6/2)-1=2
計(jì)數(shù)排序?qū)σ欢ǚ秶鷥?nèi)的整數(shù)排序時(shí)候的速度非常快,一般快于其他排序算法。但計(jì)數(shù)排序局限性比較大,只限于對(duì)整數(shù)進(jìn)行排序,而且待排序元素值分布較連續(xù)、跨度小的情況。
計(jì)數(shù)排序是一個(gè)排序時(shí)不比較元素大小的排序算法。
如果一個(gè)數(shù)組里所有元素都是整數(shù),而且都在0-K以內(nèi)。對(duì)于數(shù)組里每個(gè)元素來(lái)說(shuō),如果能知道數(shù)組里有多少項(xiàng)小于或等于該元素,就能準(zhǔn)確地給出該元素在排序后的數(shù)組的位置。
桶排序 (Bucket sort)的工作的原理:假設(shè)輸入數(shù)據(jù)服從均勻分布,利用某種函數(shù)的映射關(guān)系將數(shù)據(jù)分到有限數(shù)量的桶里,每個(gè)桶再分別排序(有可能再使用別的排序算法或是以遞歸方式繼續(xù)使用桶排序)。
桶排序利用函數(shù)的映射關(guān)系,減少了幾乎所有的比較工作。實(shí)際上,桶排序的f(k)值的計(jì)算,其作用就相當(dāng)于快排中劃分,已經(jīng)把大量數(shù)據(jù)分割成了基本有序的數(shù)據(jù)塊(桶)。然后只需要對(duì)桶中的少量數(shù)據(jù)做排序即可。
常見(jiàn)的數(shù)據(jù)元素一般是由若干位組成的,比如字符串由若干字符組成,整數(shù)由若干位0~9數(shù)字組成?;鶖?shù)排序按照從右往左的順序,依次將每一位都當(dāng)做一次關(guān)鍵字,然后按照該關(guān)鍵字對(duì)數(shù)組排序,同時(shí)每一輪排序都基于上輪排序后的結(jié)果;當(dāng)我們將所有的位排序后,整個(gè)數(shù)組就達(dá)到有序狀態(tài)?;鶖?shù)排序不是基于比較的算法。
基數(shù)是什么意思?對(duì)于十進(jìn)制整數(shù),每一位都只可能是0~9中的某一個(gè),總共10種可能。那10就是它的基,同理二進(jìn)制數(shù)字的基為2;對(duì)于字符串,如果它使用的是8位的擴(kuò)展ASCII字符集,那么它的基就是256。
基數(shù)排序 vs 計(jì)數(shù)排序 vs 桶排序
基數(shù)排序有兩種方法:
MSD 從高位開(kāi)始進(jìn)行排序
LSD 從低位開(kāi)始進(jìn)行排序
這三種排序算法都利用了桶的概念,但對(duì)桶的使用方法上有明顯差異:
基數(shù)排序:根據(jù)鍵值的每位數(shù)字來(lái)分配桶
計(jì)數(shù)排序:每個(gè)桶只存儲(chǔ)單一鍵值
桶排序:每個(gè)桶存儲(chǔ)一定范圍的數(shù)值
有時(shí),待排序的文件很大,計(jì)算機(jī)內(nèi)存不能容納整個(gè)文件,這時(shí)候?qū)ξ募筒荒苁褂脙?nèi)部排序了(我們一般的排序都是在內(nèi)存中做的,所以稱之為內(nèi)部排序,而外部排序是指待排序的內(nèi)容不能在內(nèi)存中一下子完成,它需要做內(nèi)外存的內(nèi)容交換),外部排序常采用的排序方法也是歸并排序,這種歸并方法由兩個(gè)不同的階段組成:
采用適當(dāng)?shù)膬?nèi)部排序方法對(duì)輸入文件的每個(gè)片段進(jìn)行排序,將排好序的片段(成為歸并段)寫(xiě)到外部存儲(chǔ)器中(通常由一個(gè)可用的磁盤作為臨時(shí)緩沖區(qū)),這樣臨時(shí)緩沖區(qū)中的每個(gè)歸并段的內(nèi)容是有序的。
利用歸并算法,歸并第一階段生成的歸并段,直到只剩下一個(gè)歸并段為止。
例如要對(duì)外存中4500個(gè)記錄進(jìn)行歸并,而內(nèi)存大小只能容納750個(gè)記錄,在第一階段,我們可以每次讀取750個(gè)記錄進(jìn)行排序,這樣可以分六次讀取,進(jìn)行排序,可以得到六個(gè)有序的歸并段
每個(gè)歸并段的大小是750個(gè)記錄,并將這些歸并段全部寫(xiě)到臨時(shí)緩沖區(qū)(由一個(gè)可用的磁盤充當(dāng))內(nèi)了,這是第一步的排序結(jié)果。
完成第二步該怎么做呢?這時(shí)候歸并算法就有用處了。
二、快速排序算法在平均情況下的時(shí)間復(fù)雜度為 求詳解
時(shí)間復(fù)雜度為O(nlogn) n為元素個(gè)數(shù)
1. 快速排序的三個(gè)步驟:
1.1. 找到序列中用于劃分序列的元素
1.2. 用元素劃分序列
1.3. 對(duì)劃分后的兩個(gè)序列重復(fù)1,2兩個(gè)步驟指導(dǎo)序列無(wú)法再劃分
所以對(duì)于n個(gè)元素其排序時(shí)間為
T(n) = 2*T(n/2) + n (表示將長(zhǎng)度為n的序列劃分為兩個(gè)子序列,每個(gè)子序列需要T(n/2)
的時(shí)間,而劃分序列需要n的時(shí)間)
而 T(1) = 1 (表示長(zhǎng)度為1的序列無(wú)法劃分子序列,只需要1的時(shí)間即可)
T(n) = 2^logn + logn * n (n被不斷二分最終只能二分logn次(最優(yōu)的情況,每次選取
的元素都均分序列))
= n + nlogn
因此T(n) = O(nlogn)
以上是最優(yōu)情況的推導(dǎo),因此快速排序在最優(yōu)情況下其排序時(shí)間為O(nlogn),通常平均情況
我們也認(rèn)為是此值。
在最壞情況下其會(huì)退化為冒泡排序,T(n) = T(n - 1) + n (每次選取的元素只能將序列劃分為
一段,即自身是 最小元素或最大元素)
因此T(n) = n * (n-1) / 2 相當(dāng)于O(n^2)
三、o(1), o(n), o(logn), o(nlogn)
由于平時(shí)接觸算法比較少,今天看資料看到了o(1),都不知道是什么意思,查資料之后才理解。
描述算法復(fù)雜度時(shí),常用o(1), o(n), o(logn), o(nlogn)表示對(duì)應(yīng)算法的時(shí)間復(fù)雜度,是算法的時(shí)空復(fù)雜度的表示。不僅僅用于表示時(shí)間復(fù)雜度,也用于表示空間復(fù)雜度。
O后面的括號(hào)中有一個(gè)函數(shù),指明某個(gè)算法的耗時(shí)/耗空間與數(shù)據(jù)增長(zhǎng)量之間的關(guān)系。其中的n代表輸入數(shù)據(jù)的量。
比如時(shí)間復(fù)雜度為O(n),就代表數(shù)據(jù)量增大幾倍,耗時(shí)也增大幾倍。比如常見(jiàn)的遍歷算法。再比如時(shí)間復(fù)雜度O(n^2),就代表數(shù)據(jù)量增大n倍時(shí),耗時(shí)增大n的平方倍,這是比線性更高的時(shí)間復(fù)雜度。比如冒泡排序,就是典型的O(n^2)的算法,對(duì)n個(gè)數(shù)排序,需要掃描n×n次。
再比如O(logn),當(dāng)數(shù)據(jù)增大n倍時(shí),耗時(shí)增大logn倍(這里的log是以2為底的,比如,當(dāng)數(shù)據(jù)增大256倍時(shí),耗時(shí)只增大8倍,是比線性還要低的時(shí)間復(fù)雜度)。二分查找就是O(logn)的算法,每找一次排除一半的可能,256個(gè)數(shù)據(jù)中查找只要找8次就可以找到目標(biāo)。
O(nlogn)同理,就是n乘以logn,當(dāng)數(shù)據(jù)增大256倍時(shí),耗時(shí)增大256*8=2048倍。這個(gè)復(fù)雜度高于線性低于平方。歸并排序就是O(nlogn)的時(shí)間復(fù)雜度。
O(1)就是最低的時(shí)空復(fù)雜度了,也就是耗時(shí)/耗空間與輸入數(shù)據(jù)大小無(wú)關(guān),無(wú)論輸入數(shù)據(jù)增大多少倍,耗時(shí)/耗空間都不變。 哈希算法就是典型的O(1)時(shí)間復(fù)雜度,無(wú)論數(shù)據(jù)規(guī)模多大,都可以在一次計(jì)算后找到目標(biāo)(不考慮沖突的話)
四、軟件設(shè)計(jì)師考試 | 第三章 數(shù)據(jù)結(jié)構(gòu) | 排序
假設(shè)含 n 個(gè)記錄的文件內(nèi)容為 {R1,R2,...,Rn} ,相應(yīng)的關(guān)鍵字為 {k1,k2,...,kn} 。經(jīng)過(guò)排序確定一種排列 {Rj1,Rj2,...,Rjn} ,使得它們的關(guān)鍵字滿足以下遞增(或遞減)關(guān)系: kj1<=kj2<=...<=kjn(或kj1>=kj2>=...>=kjn) 。
排序方法的穩(wěn)定與不穩(wěn)定:
內(nèi)部排序和外部排序:
方法: 在插入第 i 個(gè)記錄時(shí), R1,R2,...,Ri-1 已經(jīng)排好序,這時(shí)將 Ri 的關(guān)鍵字 ki 依次與關(guān)鍵字 ki-1,ki-2 等進(jìn)行比較,從而找到應(yīng)該插入的位置并將 Ri 插入,插入位置及其后的記錄依次向后移動(dòng)。
直接插入排序 是一種 穩(wěn)定 的排序方法 , 時(shí)間復(fù)雜度為O(n^2),空間復(fù)雜度為O(1)。
方法: 首先將第一個(gè)記錄的關(guān)鍵字和第二個(gè)記錄的關(guān)鍵字進(jìn)行比較,若為逆序,則交換這兩個(gè)記錄的值,然后比較第二個(gè)記錄和第三個(gè)記錄的關(guān)鍵字,依此類推,直到第 n-1 個(gè)記錄和第 n 個(gè)記錄的關(guān)鍵字比較過(guò)為止。上述過(guò)程稱為第一趟冒泡排序,然后再進(jìn)行多次冒泡排序,直到冒泡排序過(guò)程中沒(méi)有進(jìn)行相鄰位置的元素交換處理為止。
冒泡排序 是一種 穩(wěn)定 的排序方法 , 時(shí)間復(fù)雜度為O(n^2),空間復(fù)雜度為O(1)。
方法: 通過(guò) n-i (1<=i<=n) 再次關(guān)鍵字之間的比較,從 n-i+1 個(gè)記錄中選出關(guān)鍵字最小的記錄,并和第 i 個(gè)記錄進(jìn)行交換,當(dāng) i 等于 n 時(shí)所有記錄有序排列。
簡(jiǎn)單選擇排序 是一種 不穩(wěn)定 的排序方法 , 時(shí)間復(fù)雜度為O(n^2),空間復(fù)雜度為O(1)。
又稱為“縮小增量排序”,它是對(duì)直接插入排序方法的改進(jìn)。
方法: 先將整個(gè)待排序記錄分割成若干子序列,然后分別進(jìn)行直接插入排序,待整個(gè)序列中的記錄基本有序時(shí),再對(duì)全體記錄進(jìn)行一次直接插入排序。具體做法是:先取一個(gè)小于 n 的整數(shù) d1 作為第一個(gè)增量,把文件的全部記錄分成 d1 個(gè)組,即將所有距離為 d1 倍數(shù)序號(hào)的記錄放在同一個(gè)組中,在各組內(nèi)進(jìn)行直接插入排序;然后取第二個(gè)增量 d2 (d2<d1) ,重復(fù)上述分組和排序工作,依此類推,直到所取的增量 di=1 (di<di-1<...<dc<d1) ,即所有記錄放在同一組進(jìn)行直接插入排序?yàn)橹埂?/p>
希爾排序 是一種 不穩(wěn)定 的排序方法 , 時(shí)間復(fù)雜度為O(n^1.3),空間復(fù)雜度為O(1)。
方法: 附設(shè)兩個(gè)位置指示變量 i 和 j ,它們的初值分別指向序列的第一個(gè)記錄和最后一個(gè)記錄。設(shè)樞軸記錄(通常是第一個(gè)記錄)的關(guān)鍵字為 pivot ,則首先從 j 所指位置起向前搜索,找到第一個(gè)關(guān)鍵字小于 pivot 的記錄時(shí)將記錄向前移到 i 指示的位置,然后從 i 所指位置起向后搜索,找到第一個(gè)關(guān)鍵字大于 pivot 的記錄時(shí)將該記錄后移到 j 所指位置,重復(fù)該過(guò)程直至 i 與 j 相等為止。
快速排序 是一種 不穩(wěn)定 的排序方法 , 時(shí)間復(fù)雜度為O(nlogn),空間復(fù)雜度為O(logn)。
方法: 對(duì)一組待排序記錄的關(guān)鍵字,首先按堆的定義排成一個(gè)序列(即建立初始堆),從而可以輸出堆頂?shù)淖畲箨P(guān)鍵字(對(duì)于大根堆而言),然后將剩余的關(guān)鍵字再調(diào)整成新堆,便得到次大的關(guān)鍵字,如此反復(fù),直到全部關(guān)鍵字排成有序序列為止。
堆排序 是一種 不穩(wěn)定 的排序方法 , 時(shí)間復(fù)雜度為O(nlogn),空間復(fù)雜度為O(1)。
方法: 將兩個(gè)或兩個(gè)以上的有序文件合并成一個(gè)新的有序文件。實(shí)現(xiàn)方法是:把一個(gè)有 n 個(gè)記錄的無(wú)序文件看成是由 n 個(gè)長(zhǎng)度為 1 的有序子文件組成的文件,然后進(jìn)行兩兩歸并,得到 n/2 個(gè)長(zhǎng)度為 2 或 1 的有序文件,再兩兩歸并,如此重復(fù),直到最后形成包含 n 個(gè)記錄的有序文件為止。
歸并排序 是一種 穩(wěn)定 的排序方法 , 時(shí)間復(fù)雜度為O(nlogn),空間復(fù)雜度為O(n)。
方法: 設(shè)立 r 個(gè)隊(duì)列,隊(duì)列的編號(hào)分別為 0、1、2、...、r-1 。首先按最低有效位的值把 n 個(gè)關(guān)鍵字分配到這 r 個(gè)隊(duì)列中;然后按照隊(duì)列編號(hào)從小到大將各隊(duì)列中的關(guān)鍵字依次收集起來(lái);接著再按次低有效位的值把剛收集起來(lái)的關(guān)鍵字分配到 r 個(gè)隊(duì)列中。重復(fù)上述分配和收集過(guò)程,直到按照最高有效位分配和收集。這樣就得到一個(gè)從小到大有序的關(guān)鍵字序列。
對(duì)于 n 個(gè)記錄,執(zhí)行一次分配和收集的時(shí)間為 O(n+r) 。如果關(guān)鍵字有 d 位,則要執(zhí)行 d 便。所以總的運(yùn)算時(shí)間為 O(d(n+r)) 。
基數(shù)排序 是一種 穩(wěn)定 的排序方法 , 時(shí)間復(fù)雜度為O(d(n+rd)),空間復(fù)雜度為O(rd)。
各個(gè)排序方法的性能比較:
外部排序是對(duì)大型文件的排序,待排序的記錄存放在外存。
常用的外部排序方法是歸并排序。
以上就是關(guān)于nlogn的排序相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
fifaonline3隊(duì)套排行榜(fifaonline3最強(qiáng)隊(duì)套)
chatGPT翻譯語(yǔ)音(chat online翻譯)
win7刪除winload如何恢復(fù)(win7系統(tǒng)刪除的文件怎么找回)
《景觀設(shè)計(jì)要素》(景觀設(shè)計(jì)要素包括哪幾個(gè)方面)
猜你喜歡
華為將小說(shuō)導(dǎo)入mp4(華為將小說(shuō)導(dǎo)入mp4格式)
照片編輯器手機(jī)版免費(fèi)官方下載(照片編輯器手機(jī)版免費(fèi)官方下載蘋(píng)果)
企業(yè)注冊(cè)信息查詢(企業(yè)注冊(cè)信息查詢系統(tǒng)官網(wǎng))
圖片轉(zhuǎn)化pdf文檔(圖片轉(zhuǎn)化PDF文檔)
想清楚說(shuō)明白做到位(想清楚說(shuō)明白做到位的成語(yǔ))
功能法的理論基礎(chǔ)(功能法的理論基礎(chǔ)和主要特征)