導航:首頁 > 源碼編譯 > 演算法排序法怎麼理解

演算法排序法怎麼理解

發布時間:2023-04-10 05:37:57

A. 排序演算法總結

排序演算法是什麼?有多少種?排序演算法總結又是怎樣?以下是為您整理的排序演算法總結,供您參考!

【排序演算法總結】

排序演算法:一種能將一串數據依照特定的排序方式進行排列的一種演算法。

排序演算法性能:取決於時間和空間復雜度,其次還得考慮穩定性,及其適應的場景。

穩定性:讓原本有相等鍵值的記錄維持相對次序。也就是若一個排序演算法是穩定的,當有倆個相等鍵值的記錄R和S,且原本的序列中R在S前,那麼排序後的列表中R應該也在S之前。

以下來總結常用的排序演算法,加深對排序的理解。

冒泡排序

原理

倆倆比較相鄰記錄的排序碼,若發生逆序,則交旅派配換;有倆種方式進行冒泡,一種是先把小的冒泡到前邊去,另一種是把大的元素冒泡到後邊。

性能

時間復雜度為O(N^2),空間復雜度為O(1)。排序是穩定的,排序比較次數與初始序列無關,但交換次數與初始序列有關。

優化

若初始序列就是排序好的,對於冒泡排序仍然還要比較O(N^2)次,但無交換次數。可根據這個進行優化,設置一個flag,當在一趟序列中沒有發生交換,則該序列已排序好,但優化後排序的時間復雜度沒有發生量級的改變。

代碼

插入排序

原理

依次選擇一個待排序的數據,插入到前邊已排好序的序列中。

性能

時間復雜度為O(N^2),空間復雜度為O(1)。演算法是穩定的,比較次數和交換次數都與初始序列有關。

優化

直接插入排序每次往前插入時,是按順序依次往前找,可在這里進行優化,往前找合適的插入位置時採用二分查找的方式,即折半插入。

折半插入排序相對直接插入排序而言:平均性能更快,時間復雜度降至O(NlogN),排序是穩定的,但排序的比較次數與初始序列無關,總是需要foor(log(i))+1次排序比較。

使用場景

當數據基本有序時,採用插入排序可以明顯減少數據交換和數據移動次數,進而提升排序效率。

代碼

希爾排拆指序

原理

插入排序的改進版,是基於插入排序的以下倆點性質而提出的改進方法:

插入排序對幾乎已排好序的數據操作時,效率很高,可以達到線性排序的效率。

但插入排序在每次往前插入時只能將數據移動一位,效率比較低。

所以希爾排序的思想是:

先是取一個合適的gap

縮小間隔gap,例如去gap=ceil(gap/2),重復上述子序列劃分和排序

直到,最後gap=1時,將所有元素放在同一個序列中進行插入排序為止。

性能

開始時,gap取值較大,子序列中的元素較少,排序速度快,克服了直接插入排序的缺點;其次,gap值逐漸變小後,雖然子序列的元素逐漸變多,但大多元素已基本有序,所以繼承了直接插入排序的優點,能以近線性的速度排好序。

代碼

選擇排序

原理

每次從未排序的序列中找到最小值,記錄並最後存放到已排序序羨碰列的末尾

性能

時間復雜度為O(N^2),空間復雜度為O(1),排序是不穩定的(把最小值交換到已排序的末尾導致的),每次都能確定一個元素所在的最終位置,比較次數與初始序列無關。

代碼

快速排序

原理

分而治之思想:

Divide:找到基準元素pivot,將數組A[p..r]劃分為A[p..pivotpos-1]和A[pivotpos+1…q],左邊的元素都比基準小,右邊的元素都比基準大;

Conquer:對倆個劃分的數組進行遞歸排序;

Combine:因為基準的作用,使得倆個子數組就地有序,無需合並操作。

性能

快排的平均時間復雜度為O(NlogN),空間復雜度為O(logN),但最壞情況下,時間復雜度為O(N^2),空間復雜度為O(N);且排序是不穩定的,但每次都能確定一個元素所在序列中的最終位置,復雜度與初始序列有關。

優化

當初始序列是非遞減序列時,快排性能下降到最壞情況,主要因為基準每次都是從最左邊取得,這時每次只能排好一個元素。

所以快排的優化思路如下:

優化基準,不每次都從左邊取,可以進行三路劃分,分別取最左邊,中間和最右邊的中間值,再交換到最左邊進行排序;或者進行隨機取得待排序數組中的某一個元素,再交換到最左邊,進行排序。

在規模較小情況下,採用直接插入排序

代碼

歸並排序

原理

分而治之思想:

Divide:將n個元素平均劃分為各含n/2個元素的子序列;

Conquer:遞歸的解決倆個規模為n/2的子問題;

Combine:合並倆個已排序的子序列。

性能

時間復雜度總是為O(NlogN),空間復雜度也總為為O(N),演算法與初始序列無關,排序是穩定的。

優化

優化思路:

在規模較小時,合並排序可採用直接插入;

在寫法上,可以在生成輔助數組時,倆頭小,中間大,這時不需要再在後邊加倆個while循環進行判斷,只需一次比完。

代碼

堆排序

原理

堆的性質:

是一棵完全二叉樹

每個節點的值都大於或等於其子節點的值,為最大堆;反之為最小堆。

堆排序思想:

將待排序的序列構造成一個最大堆,此時序列的最大值為根節點

依次將根節點與待排序序列的最後一個元素交換

再維護從根節點到該元素的前一個節點為最大堆,如此往復,最終得到一個遞增序列

性能

時間復雜度為O(NlogN),空間復雜度為O(1),因為利用的排序空間仍然是初始的序列,並未開辟新空間。演算法是不穩定的,與初始序列無關。

使用場景

想知道最大值或最小值時,比如優先順序隊列,作業調度等場景。

代碼

計數排序

原理

先把每個元素的出現次數算出來,然後算出該元素所在最終排好序列中的絕對位置(最終位置),再依次把初始序列中的元素,根據該元素所在最終的絕對位置移到排序數組中。

性能

時間復雜度為O(N+K),空間復雜度為O(N+K),演算法是穩定的,與初始序列無關,不需要進行比較就能排好序的演算法。

使用場景

演算法只能使用在已知序列中的元素在0-k之間,且要求排序的復雜度在線性效率上。

代碼

桶排序

原理

根據待排序列元素的大小范圍,均勻獨立的劃分M個桶

將N個輸入元素分布到各個桶中去

再對各個桶中的元素進行排序

此時再按次序把各桶中的元素列出來即是已排序好的。

性能

時間復雜度為O(N+C),O(C)=O(M(N/M)log(N/M))=O(NlogN-NlogM),空間復雜度為O(N+M),演算法是穩定的,且與初始序列無關。

使用場景

演算法思想和散列中的開散列法差不多,當沖突時放入同一個桶中;可應用於數據量分布比較均勻,或比較側重於區間數量時。

基數排序

原理

對於有d個關鍵字時,可以分別按關鍵字進行排序。有倆種方法:

MSD:先從高位開始進行排序,在每個關鍵字上,可採用計數排序

LSD:先從低位開始進行排序,在每個關鍵字上,可採用桶排序

性能

時間復雜度為O(d*(N+K)),空間復雜度為O(N+K)。

總結

以上排序演算法的時間、空間與穩定性的總結如下:

B. 排序演算法概述

十大排序演算法:冒泡排序,選擇排序,插入排序,歸並排序,堆排序,快速排序、希爾排序、計數排序,基數排序,桶排序

穩定 :如果a原本在b前面,而a=b,排序之後a仍然在b的前面;
不穩定 :如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面;
排序演算法如果是穩定的,那麼從一個鍵上排序,然後再從另一個鍵上排序,前一個鍵排序的結果可以為後一個鍵排序所用。

演算法的復雜度往往取決於數據的規模大小和數據本身分布性質。
時間復雜度 : 一個演算法執行所耗費的時間。
空間復雜度 :對一個演算法在運行過程中臨時佔用存儲空間大小的量度。
常見復雜度由小到大 :O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)

在各種不同演算法中,若演算法中語句執行次數(佔用空間)為一個常數,則復雜度為O(1);
當一個演算法的復雜度與以2為底的n的對數成正比時,可表示為O(log n);
當一個演算法的復雜度與n成線性比例關系時,可表示為O (n),依次類推。

冒泡、選擇、插入排序需要兩個for循環,每次只關注一個元素,平均時間復雜度為
(一遍找元素O(n),一遍找位置O(n))
快速、歸並、堆基於分治思想,log以2為底,平均時間復雜度往往和O(nlogn)(一遍找元素O(n),一遍找位置O(logn))相關
而希爾排序依賴於所取增量序列的性質,但是到目前為止還沒有一個最好的增量序列 。例如希爾增量序列時間復雜度為O(n²),而Hibbard增量序列的希爾排序的時間復雜度為 , 有人在大量的實驗後得出結論;當n在某個特定的范圍後希爾排序的最小時間復雜度大約為n^1.3。

從平均時間來看,快速排序是效率最高的:
快速排序中平均時間復雜度O(nlog n),這個公式中隱含的常數因子很小,比歸並排序的O(nlog n)中的要小很多,所以大多數情況下,快速排序總是優於合並排序的。

而堆排序的平均時間復雜度也是O(nlog n),但是堆排序存在著重建堆的過程,它把根節點移除後,把最後的葉子結點拿上來後需要重建堆,但是,拿上的值是要比它的兩個葉子結點要差很多的,一般要比較很多次,才能回到合適的位置。堆排序就會有很多的時間耗在堆調整上。

雖然快速排序的最壞情況為排序規模(n)的平方關系,但是這種最壞情況取決於每次選擇的基準, 對於這種情況,已經提出了很多優化的方法,比如三取樣劃分和Dual-Pivot快排。
同時,當排序規模較小時,劃分的平衡性容易被打破,而且頻繁的方法調用超過了O(nlog n)為
省出的時間,所以一般排序規模較小時,會改用插入排序或者其他排序演算法。

一種簡單的排序演算法。它反復地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。這個工作重復地進行直到沒有元素再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為元素會經由交換慢慢「浮」到數列的頂端。
1.從數組頭開始,比較相鄰的元素。如果第一個比第二個大(小),就交換它們兩個;
2.對每一對相鄰元素作同樣的工作,從開始第一對到尾部的最後一對,這樣在最後的元素應該會是最大(小)的數;
3.重復步驟1~2,重復次數等於數組的長度,直到排序完成。

首先,找到數組中最大(小)的那個元素;
其次,將它和數組的第一個元素交換位置(如果第一個元素就是最大(小)元素那麼它就和自己交換);
再次,在剩下的元素中找到最大(小)的元素,將它與數組的第二個元素交換位置。如此往復,直到將整個數組排序。
這種方法叫做選擇排序,因為它在不斷地選擇剩餘元素之中的最大(小)者。

對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。
為了給要插入的元素騰出空間,我們需要將插入位置之後的已排序元素在都向後移動一位。
插入排序所需的時間取決於輸入中元素的初始順序。例如,對一個很大且其中的元素已經有序(或接近有序)的數組進行排序將會比對隨機順序的數組或是逆序數組進行排序要快得多。
總的來說,插入排序對於部分有序的數組十分高效,也很適合小規模數組。

一種基於插入排序的快速的排序演算法。簡單插入排序對於大規模亂序數組很慢,因為元素只能一點一點地從數組的一端移動到另一端。例如,如果主鍵最小的元素正好在數組的盡頭,要將它挪到正確的位置就需要N-1 次移動。
希爾排序為了加快速度簡單地改進了插入排序,也稱為縮小增量排序,同時該演算法是突破O(n^2)的第一批演算法之一。
希爾排序是把待排序數組按一定數量的分組,對每組使用直接插入排序演算法排序;然後縮小數量繼續分組排序,隨著數量逐漸減少,每組包含的元素越來越多,當數量減至 1 時,整個數組恰被分成一組,排序便完成了。這個不斷縮小的數量,就構成了一個增量序列。

在先前較大的增量下每個子序列的規模都不大,用直接插入排序效率都較高,盡管在隨後的增量遞減分組中子序列越來越大,由於整個序列的有序性也越來越明顯,則排序效率依然較高。
從理論上說,只要一個數組是遞減的,並且最後一個值是1,都可以作為增量序列使用。有沒有一個步長序列,使得排序過程中所需的比較和移動次數相對較少,並且無論待排序列記錄數有多少,演算法的時間復雜度都能漸近最佳呢?但是目前從數學上來說,無法證明某個序列是「最好的」。
常用的增量序列
希爾增量序列 :{N/2, (N / 2)/2, ..., 1},其中N為原始數組的長度,這是最常用的序列,但卻不是最好的
Hibbard序列:{2^k-1, ..., 3,1}
Sedgewick序列:{... , 109 , 41 , 19 , 5,1} 表達式為

歸並排序是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法的一個非常典型的應用。
對於給定的一組數據,利用遞歸與分治技術將數據序列劃分成為越來越小的半子表,在對半子表排序後,再用遞歸方法將排好序的半子表合並成為越來越大的有序序列。
為了提升性能,有時我們在半子表的個數小於某個數(比如15)的情況下,對半子表的排序採用其他排序演算法,比如插入排序。
若將兩個有序表合並成一個有序表,稱為2-路歸並,與之對應的還有多路歸並。

快速排序(Quicksort)是對冒泡排序的一種改進,也是採用分治法的一個典型的應用。
首先任意選取一個數據(比如數組的第一個數)作為關鍵數據,我們稱為基準數(Pivot),然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序,也稱為分區(partition)操作。
通過一趟快速排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數組變成有序序列。
為了提升性能,有時我們在分割後獨立的兩部分的個數小於某個數(比如15)的情況下,會採用其他排序演算法,比如插入排序。

基準的選取:最優的情況是基準值剛好取在無序區數值的中位數,這樣能夠最大效率地讓兩邊排序,同時最大地減少遞歸劃分的次數,但是一般很難做到最優。基準的選取一般有三種方式,選取數組的第一個元素,選取數組的最後一個元素,以及選取第一個、最後一個以及中間的元素的中位數(如4 5 6 7, 第一個4, 最後一個7, 中間的為5, 這三個數的中位數為5, 所以選擇5作為基準)。
Dual-Pivot快排:雙基準快速排序演算法,其實就是用兩個基準數, 把整個數組分成三份來進行快速排序,在這種新的演算法下面,比經典快排從實驗來看節省了10%的時間。

許多應用程序都需要處理有序的元素,但不一定要求他們全部有序,或者不一定要一次就將他們排序,很多時候,我們每次只需要操作數據中的最大元素(最小元素),那麼有一種基於二叉堆的數據結構可以提供支持。
所謂二叉堆,是一個完全二叉樹的結構,同時滿足堆的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。在一個二叉堆中,根節點總是最大(或者最小)節點。
堆排序演算法就是抓住了這一特點,每次都取堆頂的元素,然後將剩餘的元素重新調整為最大(最小)堆,依次類推,最終得到排序的序列。

推論1:對於位置為K的結點 左子結點=2 k+1 右子結點=2 (k+1)
驗證:C:2 2 2+1=5 2 (2+1)=6
推論2:最後一個非葉節點的位置為 (N/2)-1,N為數組長度。
驗證:數組長度為6,(6/2)-1=2

計數排序對一定范圍內的整數排序時候的速度非常快,一般快於其他排序演算法。但計數排序局限性比較大,只限於對整數進行排序,而且待排序元素值分布較連續、跨度小的情況。
計數排序是一個排序時不比較元素大小的排序演算法。
如果一個數組里所有元素都是整數,而且都在0-K以內。對於數組里每個元素來說,如果能知道數組里有多少項小於或等於該元素,就能准確地給出該元素在排序後的數組的位置。

桶排序 (Bucket sort)的工作的原理:假設輸入數據服從均勻分布,利用某種函數的映射關系將數據分到有限數量的桶里,每個桶再分別排序(有可能再使用別的排序演算法或是以遞歸方式繼續使用桶排序)。
桶排序利用函數的映射關系,減少了幾乎所有的比較工作。實際上,桶排序的f(k)值的計算,其作用就相當於快排中劃分,已經把大量數據分割成了基本有序的數據塊(桶)。然後只需要對桶中的少量數據做排序即可。

常見的數據元素一般是由若干位組成的,比如字元串由若干字元組成,整數由若干位0~9數字組成。基數排序按照從右往左的順序,依次將每一位都當做一次關鍵字,然後按照該關鍵字對數組排序,同時每一輪排序都基於上輪排序後的結果;當我們將所有的位排序後,整個數組就達到有序狀態。基數排序不是基於比較的演算法。
基數是什麼意思?對於十進制整數,每一位都只可能是0~9中的某一個,總共10種可能。那10就是它的基,同理二進制數字的基為2;對於字元串,如果它使用的是8位的擴展ASCII字元集,那麼它的基就是256。

基數排序 vs 計數排序 vs 桶排序

基數排序有兩種方法:
MSD 從高位開始進行排序
LSD 從低位開始進行排序
這三種排序演算法都利用了桶的概念,但對桶的使用方法上有明顯差異:
基數排序:根據鍵值的每位數字來分配桶
計數排序:每個桶只存儲單一鍵值
桶排序:每個桶存儲一定范圍的數值

有時,待排序的文件很大,計算機內存不能容納整個文件,這時候對文件就不能使用內部排序了(我們一般的排序都是在內存中做的,所以稱之為內部排序,而外部排序是指待排序的內容不能在內存中一下子完成,它需要做內外存的內容交換),外部排序常採用的排序方法也是歸並排序,這種歸並方法由兩個不同的階段組成:
採用適當的內部排序方法對輸入文件的每個片段進行排序,將排好序的片段(成為歸並段)寫到外部存儲器中(通常由一個可用的磁碟作為臨時緩沖區),這樣臨時緩沖區中的每個歸並段的內容是有序的。
利用歸並演算法,歸並第一階段生成的歸並段,直到只剩下一個歸並段為止。

例如要對外存中4500個記錄進行歸並,而內存大小隻能容納750個記錄,在第一階段,我們可以每次讀取750個記錄進行排序,這樣可以分六次讀取,進行排序,可以得到六個有序的歸並段
每個歸並段的大小是750個記錄,並將這些歸並段全部寫到臨時緩沖區(由一個可用的磁碟充當)內了,這是第一步的排序結果。
完成第二步該怎麼做呢?這時候歸並演算法就有用處了。

C. 我對幾種常見排序演算法的理解

排序演算法一般分為以下幾種: (1)非線性時間比較類排序:交換類排序(快速排序和冒泡排序)、插入類排序(簡單插入排序和希爾排序)、選擇類排序(簡單選擇排序和堆排序)、歸並排序(二路歸並排序和多路歸並排序);(2)線性時間非比較類排序:計數排序、基數排序和桶排序。

D. 如何理解《演算法圖解》中的快速排序演算法

快速排序的基本思想就是從一個數組中任意挑選一個元素(通常來說會選擇最左邊的元素)作為中軸元素,將剩下的元素以中軸元素作為比較的標准,將小於等於中軸元素的放到中軸元素的左邊,將大於中軸元素的放到中軸元素的右邊。

然後以當前中軸元素的位置為界,將左半部分子數組和右半部分子數組看成兩個新的數組,重復上述操作,直到子數組的元素個數小於等於1(因為一個元素的數組必定是有序的)。

以下的代碼中會常常使用交換數組中兩個元素值的Swap方法,其代碼如下

publicstaticvoidSwap(int[] A, inti, intj){

inttmp;

tmp = A[i];

A[i] = A[j];

A[j] = tmp;


(4)演算法排序法怎麼理解擴展閱讀:

快速排序演算法 的基本思想是:將所要進行排序的數分為左右兩個部分,其中一部分的所有數據都比另外一 部分的數據小,然後將所分得的兩部分數據進行同樣的劃分,重復執行以上的劃分操作,直 到所有要進行排序的數據變為有序為止。

定義兩個變數low和high,將low、high分別設置為要進行排序的序列的起始元素和最後一個元素的下標。第一次,low和high的取值分別為0和n-1,接下來的每次取值由劃分得到的序列起始元素和最後一個元素的下標來決定。

定義一個變數key,接下來以key的取值為基準將數組A劃分為左右兩個部分,通 常,key值為要進行排序序列的第一個元素值。第一次的取值為A[0],以後毎次取值由要劃 分序列的起始元素決定。

從high所指向的數組元素開始向左掃描,掃描的同時將下標為high的數組元素依次與劃分基準值key進行比較操作,直到high不大於low或找到第一個小於基準值key的數組元素,然後將該值賦值給low所指向的數組元素,同時將low右移一個位置。

如果low依然小於high,那麼由low所指向的數組元素開始向右掃描,掃描的同時將下標為low的數組元素值依次與劃分的基準值key進行比較操作,直到low不小於high或找到第一個大於基準值key的數組元素,然後將該值賦給high所指向的數組元素,同時將high左移一個位置。

重復步驟(3) (4),直到low的植不小於high為止,這時成功劃分後得到的左右兩部分分別為A[low……pos-1]和A[pos+1……high],其中,pos下標所對應的數組元素的值就是進行劃分的基準值key,所以在劃分結束時還要將下標為pos的數組元素賦值 為 key。

E. 什麼是排序演算法

排序演算法就是將一個數組、字元串等一系列的相同類型的變數按照一定的關系(從小到大或從大到小)排序
比如冒泡法就是將數值排序
比如這個就是從小到大排序
for(i=0;i<3;i++)
for(j=i+1;j<4;j++)
if(a[i]>a[j])
{ temp=a[i];
a[i]=a[j];
a[j]=temp;
}

F. 排序演算法是怎樣的

一、背景介紹

在計算機科學與數學中,排序演算法(Sorting algorithm)是一種能將一串資料依照特定排序方式進行排列的一種演算法。

最常用到的排序方式是數字順序以及字典順序。

有效的排序演算法在一些演算法(例如搜尋演算法與合並演算法)中是重要的, 如此這些演算法才能得到正確解答。

排序演算法也用在處理文字資料以及產生人類可讀的輸出結果。

基本上,排序演算法的輸出必須遵守下列兩個原則:

1、輸出結果為遞增序列(遞增是針對所需的排序順序而言);

2、輸出結果是原輸入的一種排列、或是重組;

雖然排序演算法是一個簡單的問題,但是從計算機科學發展以來,在此問題上已經有大量的研究。 更多的新演算法仍在不斷的被發明。


二、知識剖析

查找和排序演算法是演算法的入門知識,其經典思想可以用於很多演算法當中。因為其實現代碼較短,應用較常見。 所以在面試中經常會問到排序演算法及其相關的問題。但萬變不離其宗,只要熟悉了思想,靈活運用也不是難事。

一般在面試中最常考的是快速排序和冒泡排序,並且經常有面試官要求現場寫出這兩種排序的代碼。對這兩種排序的代碼一定要信手拈來才行。除此之外,還有插入排序、冒泡排序、堆排序、基數排序、桶排序等。

三、常見的幾種演算法:

冒泡演算法、選擇排序、插入排序、希爾排序、歸並排序、快速排序

演算法的特點:

1、有限性:一個演算法必須保證執行有限步之後結束。

2、確切性: 一個演算法的每一步驟必須有確切的定義。

3、輸入:一個演算法有零個或多個輸入,以刻畫運算對象的初始情況,所謂零個輸入是指演算法本身給定了初始條件。

4、輸出:一個演算法有一個或多個輸出。沒有輸出的演算法毫無意義。

5、可行性:演算法中執行的任何計算步驟都是可以被分解為基本的可執行的操作步,即每個計算步都可以在有限時間內完成(也稱之為有效性)。

G. 排序是什麼意思

排序是計算機的一種操作方法,其目的是將一組「無序」的記錄序列調整為「有序」的記錄序列,主要分為內部排序和外部排序。在計算機科學與數學中,一個排序演算法(英語:Sorting algorithm)是一種能將一串數據依照特定排序方式進行排列的一種演算法。最常用到的排序方式是數值順序以及字典順序。有效的排序演算法在一些演算法(例如搜索演算法與合並演算法)中是重要的,如此這些演算法才能得到正確解答。排知哪序演算法也用在處理文字數據以及產生人類可讀的輸出結果。

(7)演算法排序法怎麼理解擴展閱讀:

排序的分類

1、穩定排序:搭信碼假設在待排序的文件中,存在兩個或兩個以上的記錄具有相同的關鍵字,在用某種排序法排序後,若這些相同關鍵字的元素的相對次序仍然不變,則這種排序方法是穩定的。其中冒泡,插入,基數,歸並屬於穩定排序,選擇,快速,希爾,歸屬於不穩定排序。

2、就地排序:若排序演算法所需的輔助空間坦野並不依賴於問題的規模n,即輔助空間為O,則稱為就地排序。

H. 基本排序演算法原理

演算法原理:每次對相鄰的兩個元素進行比較,若前者大於後者則進行交換,如此一趟下來最後一趟的就是最大元素,重復以上的步驟,除了已經確定的元素 。

演算法原理:每次對相鄰的兩個元素進行比較,若前者大於後者則進行交換,如此一趟下來最後一趟的就是最大元素,重復以上的步驟,除了已經確定的元素

演算法步驟

1)  設置兩個變數i、j,排序開始的時候:i=0,j=n-1;

2)第一個數組值作為比較值,首先保存到temp中,即temp=A[0];

3)然後j-- ,向前搜索,找到小於temp後,因為s[i]的值保存在temp中,所以直接賦值,s[i]=s[j]

4)然後i++,向後搜索,找到大於temp後,因為s[j]的值保存在第2步的s[i]中,所以直接賦值,s[j]=s[i],然後j--,避免死循環

5)重復第3、4步,直到i=j,最後將temp值返回s[i]中

6)  然後採用「二分」的思想,以i為分界線,拆分成兩個數組 s[0,i-1]、s[i+1,n-1]又開始排序

排序圖解

演算法原理:從第一個元素開始,左邊視為已排序數組,右邊視為待排序數組,從左往右依次取元素,插入左側已排序數組,對插入新元素的左側數組重新生成有序數組 。需要注意的是,在往有序數組插入一個新元素的過程中,我們可以採用按 順序循環 比較,也可以通過 折半查找法 來找到新元素的位置,兩種方式的效率 取決於數組的數據量

演算法原理:希爾排序也是利用插入排序的思想來排序。希爾排序通過將比較的全部元素分為幾個區域來提升插入排序的性能。這樣可以讓一個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,需排序的數據幾乎是已排好的了,插入效率比較高。

排序圖解

選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。選擇排序的主要優點與數據移動有關。如果某個元素位於正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當中至少有一個將被移到其最終位置上,因此對n個元素的表進行排序總共進行至多n-1次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬於非常好的一種。

歸並排序,顧名思義就是一種 「遞歸合並」 的排序方法(這個理解很重要)。對於一個數列,我們把它進行二分處理,依次遞歸下去,然後將小范圍的數進行排序,最後將其合並在一起。就實現了歸並排序。

這實際上是運用了 分治思想 ,顯然,想要把一個數列排好序,最終達到的目的就是它的任何一部分都是有序的。這樣的話,我們可以考慮分別把數列分成N多個部分,讓每個部分分別有序,然後再將其統一,變成所有的東西都有序。這樣就實現了排序。這個想法就叫分治思想。

排序圖解

排序圖解

I. 各種排序演算法的總結和比較

排序演算法是《數據結構與演算法》中最基本的演算法之一。

排序演算法可以分為內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序演算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸並排序、快速排序、堆排序、基數排序等。用一張圖概括:

點擊以下圖片查看大圖:

關於時間復雜度

平方階 (O(n2)) 排序 各類簡單排序:直接插入、直接選擇和冒泡排序。

線性對數階 (O(nlog2n)) 排序 快速排序、堆排序和歸並排序;

O(n1+§)) 排序,§ 是介於 0 和 1 之間的常數。 希爾排序

線性階 (O(n)) 排序 基數排序,此外還有桶、箱排序。

關於穩定性

穩定的排序演算法:冒泡排序、插入排序、歸並排序和基數排序。

不是穩定的排序演算法:選擇排序、快速排序、希爾排序、堆排序。

名詞解釋:

n:數據規模 k:"桶"的個數 In-place:佔用常數內存,不佔用額外內存 Out-place:佔用額外內存 穩定性:排序後 2 個相等鍵值的順序和排序之前它們的順序相同

包含以下內容:

1、冒泡排序 2、選擇排序 3、插入排序 4、希爾排序 5、歸並排序 6、快速排序 7、堆排序 8、計數排序 9、桶排序 10、基數排序

排序演算法包含的相關內容具體如下:

冒泡排序演算法

冒泡排序(Bubble Sort)也是一種簡單直觀的排序演算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢"浮"到數列的頂端。

選擇排序演算法

選擇排序是一種簡單直觀的排序演算法,無論什麼數據進去都是 O(n?) 的時間復雜度。所以用到它的時候,數據規模越小越好。唯一的好處可能就是不佔用額外的內存空間。

插入排序演算法

插入排序的代碼實現雖然沒有冒泡排序和選擇排序那麼簡單粗暴,但它的原理應該是最容易理解的了,因為只要打過撲克牌的人都應該能夠秒懂。插入排序是一種最簡單直觀的排序演算法,它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。

希爾排序演算法

希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序演算法。

歸並排序演算法

歸並排序(Merge sort)是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。

快速排序演算法

快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個項目要 Ο(nlogn) 次比較。在最壞狀況下則需要 Ο(n2) 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 Ο(nlogn) 演算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來。

堆排序演算法

堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序演算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。

計數排序演算法

計數排序的核心在於將輸入的數據值轉化為鍵存儲在額外開辟的數組空間中。作為一種線性時間復雜度的排序,計數排序要求輸入的數據必須是有確定范圍的整數。

桶排序演算法

桶排序是計數排序的升級版。它利用了函數的映射關系,高效與否的關鍵就在於這個映射函數的確定。

基數排序演算法

基數排序是一種非比較型整數排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。由於整數也可以表達字元串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是只能使用於整數。

J. 排序演算法【圖文理解】

先給出交換方法實現

相鄰兩個元素相比較,大的往後放

在n個數中找到最小(大)數與第一個數交換位置【每輪循環,都確定一個元素】

將元素插入已排序的數組中

注意插入時,如果滿足條件,就放到最後一個;不滿足條件,已排序數組就依次往後挪位;

1、拿第一個元素為基準
2、從最後一個元素開始往前找,如果第j個元素大於基準,停下來;從第一個元素開始往後找,如果第i個元素小於基準,停下來;如果i<j,就交換換i和j所在位置的元素;
3、j繼續往前找,i繼續往後找,找到就交換,直到i==j
4、交換基準所在位置和i所在位置的元素的值,得到第一次排序結果:小於基準的-基準-大於基準的
5、遞歸將基準兩邊的元素繼續進行快速排序

1、先將元素分成n組,對每組繼續插入排序;
2、再將元素分為n/2組,對每組繼續插入排序
3、知道n/2=1,對改組進行插入排序;即為最終的結果

閱讀全文

與演算法排序法怎麼理解相關的資料

熱點內容
蘋果商店怎麼更新所有app 瀏覽:34
電影香港加密 瀏覽:595
壓縮機毛細管滴水 瀏覽:850
可視化編程網頁 瀏覽:389
工廠附近租房用什麼app 瀏覽:186
老闆改需求甩鍋程序員 瀏覽:657
樂貓app是什麼平台 瀏覽:922
方舟手游如何修改伺服器後台 瀏覽:815
程序員考試教程 瀏覽:219
文件名修改為文件夾的名字批處理 瀏覽:251
拍照程序員 瀏覽:827
wps怎麼把pdf轉jpg 瀏覽:217
自拍用什麼app做的藝術照 瀏覽:169
h3c無線配置命令 瀏覽:515
linux代碼閱讀工具 瀏覽:160
能夠畫出對稱圖形的是什麼app 瀏覽:424
單片機投票器 瀏覽:467
程序員那麼可愛唱嗎 瀏覽:830
手機誤刪的app怎麼恢復 瀏覽:700
java第三方加密庫 瀏覽:660