個人專欄見:
排序演算法是計算常用的演算法之一,本專案主要解決排序演算法原理與實現問題。
## 目錄
1、堆排序
2、快速排序
3、歸併排序
## 內容
### 1、堆排序
> 1、堆排序需要用二叉樹資料結構實現嗎?
> 不需要,堆排序用陣列實現。
> 2、什麼叫堆?
>堆是一顆完全二叉樹;每個結點的值都大於其葉子節點的值稱為大頂堆,每個節點的值都小於葉子節點稱為小頂堆。
> 3、怎麼做堆排序?
>堆排序涉及兩個過程:1)建堆;2)拆堆;
>拆堆就意味著建立大頂堆並不代表完成排序;
>兩個過程是通過陣列完成的。
堆排序涉及建堆、拆堆兩個過程。
#### 1、建堆(大頂堆)
> 假設陣列a[4,6,8,5,7],初始化為乙個(自然的)完全二叉樹,那麼其葉子非節點和葉子節點有對應關係,非葉子i的左右子節點分別為2*i+1、2*i+2。
* 1)從最後乙個非葉子節點開始遍歷所有節點;
* 2)遍歷每個節點同時判斷該節點與孩子節點關係是否滿足大頂堆要求,滿足則繼續1)的遍歷,不滿足則交換值大的葉子和該節點的值使滿足堆要求(堆調整),對被交換的子節點繼續堆調整直至滿足或為葉子節點。
#### 2、拆堆
* 1)從陣列的最後乙個元素開始遍歷到第乙個元素;
* 2)遍歷每個元素需要完成以下兩個步驟:1)交換第乙個元素和當前遍歷元素;2)調整當前遍歷元素之前的所有元素為大頂堆,即對當前遍歷之前的陣列元素建堆。
堆排序的最佳與平均演算法複雜度均為nlog(n)。**見[heapsort.cc](
ps:堆排序的應用
>100000個數值,找出最大的top10 (topn)。
>1. 取10個數,建小頂堆;
>2. 遍歷剩餘數,比較數與堆頂數大小,如果大於堆頂,則交換並調整堆。
### 2、快速排序
>快速排序(英語:quicksort),又稱劃分交換排序(partition-exchange sort),簡稱快排,一種排序演算法,最早由東尼·霍爾提出。在平均狀況下,排序n個專案需要 o(nlogn)次比較。在最壞狀況下則需要 $o(n^)$次比較,但這種狀況並不常見。事實上,快速排序 (nlogn)}通常明顯比其他演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地達成。
演算法步驟:
* 從數列中挑出乙個元素,稱為「基準」(pivot),
* 重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(相同的數可以到任何一邊)。在這個分割結束之後,該基準就處於數列的中間位置。這個稱為分割(partition)操作。
* 遞迴地(recursively)把小於基準值元素的子數列和大於基準值元素的子數列排序。
**實現見[quicksort.cc](
### 3、歸併排序
>歸併排序(英語:merge sort,或mergesort),是建立在歸併操作上的一種有效的排序演算法,效率為o(nlogn)。2023年由約翰·馮·諾伊曼首次提出。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用,且各層分治遞迴可以同時進行。
>,歸併演算法的核心是歸併操作(merge),指的是將兩個已經排序的序列合併成乙個序列的操作。
值得注意的是:
* 歸併排序採用了分治思想,也可以說是分治最基礎的表現演算法。
* 歸併操作的含義,理解歸併二字的含義,自然知道演算法怎麼實現。
如下圖:
![image](
圖示來自adam drozdek《c+資料結構與演算法》,圖示最明顯展現出了一下幾個特點:
> 1. 從圖示結構上看,資料在數量呈上下對稱結構。
> 2. 從資料次序變化上看,上半結構不斷二分法拆分資料,資料次序不變;下半部分不斷合併資料,合併的時候並將資料進行排列。
因遞迴方法的**實現上其實也遵循了以上兩條,將**的遞迴用分拆(<)、合併(>)兩步,並組合巢狀形成遞迴;而遞迴的展開即為<<<...>>>的邏輯對稱結構。
**實現見[mergesort.cc](
經典排序演算法
排序分為內部排序和外部排序,內部排序是指待排序的資料都是在記憶體中的,例如陣列 外部排序指待排序資源在記憶體外,例如對檔案的排序。此篇說的是內部排序。通俗地來說,內部排序就是將一堆資料按一定規則對它進行排序。排序又分為穩定排序和不穩定的排序,如果初始序列ai,ak有序 ai ak 排序後變成了ak,...
經典排序演算法
1 氣泡排序 bubble sort 最簡單的排序方法是氣泡排序方法。這種方法的基本思想是,將待排序的元素看作是豎著排列的 氣泡 較小的元素比較輕,從而要往上浮。在氣泡排序演算法中我們要對這個 氣泡 序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰的元素的順序是否正確。...
經典排序演算法
思想 相鄰元素兩兩比較大的往下沉,小的往上浮.具體點說就是兩相鄰元素相互比較,如果前面的元素比後面的大就換位置,否則繼續比較.舉個例子吧 將陣列arr 排序 廢話了那麼多,接下來是應該有 的對吧public static void bulletsort int arr 原理 用乙個索引位置上的元素,...