排序演算法
重要性不言而喻,很多演算法問題往往選擇乙個好的排序演算法往往問題可以迎刃而解
氣泡排序(bubble sort)也是一種簡單直觀的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。也就是雙重迴圈就可以搞定的問題但是需要注意下一邊界
演算法步驟:
1)比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。
2)對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
3)針對所有的元素重複以上的步驟,除了最後乙個。
4)持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
public void bubblesort(int a)
} }
優化的氣泡排序
由於可能在前幾次就已經排好序,但是在上一種氣泡排序中仍然需要一直遍歷到最後。
優化措施:設定乙個標誌,如果這一趟發生了交換,則為true,否則為false。明顯如果有一趟沒有發生交換,說明排序已經完成。
快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要ο(n log n)次比較。在最壞狀況下則需要ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他ο(n log n) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出來。
快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。
演算法步驟:
1) 從數列中挑出乙個元素,稱為 「基準」(pivot),
2 )重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
3 )遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。
private static void quick_sort(int arr, int low, int high)
} private static int partition(int arr, int low, int high)
} // 交換中間元素和privot
歸併排序(merge sort)是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。
演算法步驟:
1. 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
2. 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
3. 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
4. 重複步驟3直到某一指標達到序列尾
5. 將另一串行剩下的所有元素直接複製到合併序列尾
public static int sort(int nums, int low, int high)
return nums;
} public static void merge(int nums, int low, int mid, int high) else
} // 把左邊剩餘的數移入陣列
while (i <= mid)
// 把右邊邊剩餘的數移入陣列
while (j <= high)
// 把新陣列中的數覆蓋nums陣列
選擇排序(selection sort)也是一種簡單直觀的排序演算法。
演算法步驟:
1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
2)再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。
3)重複第二步,直到所有元素均排序完畢。
堆排序(heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。
堆排序的平均時間複雜度為ο(nlogn) 。
演算法步驟:
1)建立乙個堆h[0..n-1]
2)把堆首(最大值)和堆尾互換
3)把堆的尺寸縮小1,並呼叫shift_down(0),目的是把新的陣列頂端資料調整到相應位置
4) 重複步驟2,直到堆的尺寸為1
調整堆部分不太好寫建議參考
最後給出一張各演算法的效能比較圖
參考:
面試常用排序演算法
public class sort 因為最後結束的時候,j又被剪了一次,所以j要加1 插入 array j 1 temp 氣泡排序 public void bubblesort int array,int length 直接選擇排序 public void selectsort int array,...
面試排序演算法總結
從第二個元素開始,每次選擇乙個元素插入到之前已經排好序的部分。選擇插入位置的時候從後往前,將帶插入元素取出,依次後移大於帶插入元素的數。演算法複雜度 最好是正序有序,需要n次比較。最差逆序有序,複雜度o n2 平均複雜度o n2 插入排序是穩定的 void insertsort int a,int ...
面試 排序演算法總結
空間複雜度 快速排序是一種原地排序,只需要乙個很小的棧作為輔助空間,空間複雜度為o log2n 所以適合在資料集比較大的時候使用。時間複雜度 時間複雜度比較複雜,最好的情況是o n 最差的情況是o n2 所以平時說的o nlogn 為其平均時間複雜度。具體操作過程 隨便取乙個值 6 將其為基準進行排...