直通BAT的排序
(1)冒泡排序
解決方案有兩種:第一種是以當前位置的元素與后面的元素作比較,將如果比這個當前元素小,就交換,一輪循環下來,保證當前元素的值是最小的。
第二種是它重復地走訪過要排序的元素,依次比較相鄰兩個元素,如果他們的順序錯誤就把他們調換過來,直到沒有元素再需要交換,排序完成。這個算法? ? ? 名字由來是因為越小(或越大)的元素會經由交換慢慢“浮”到數列的頂端
對序列{ 6, 5, 3, 1, 8, 7, 2, 4 }進行冒泡排序的實現過程如下:
?
(2)選擇排序
原理如下:現在現有序列當中找到最大(最小)的元素,放在序列的起始位置。然后再從剩余未排序的元素當中尋找最大(最小)的元素,接著放在已排好序列的后面。
冒泡排序和選擇排序的區別如下:
冒泡排序是通過依次交換相鄰兩個順序不合法的元素位置,從而將當前最小(大)元素放到合適的位置;而選擇排序每遍歷一次都記住了當前最小(大)元素的位置,最后僅需一次交換操作即可將其放到合適的位置。
// 分類 -------------- 內部比較排序 // 數據結構 ---------- 數組 // 最差時間復雜度 ---- O(n^2) // 最優時間復雜度 ---- O(n^2) // 平均時間復雜度 ---- O(n^2) // 所需輔助空間 ------ O(1) // 穩定性 ------------ 不穩定?
? 上述代碼對序列{ 8, 5, 2, 6, 9, 3, 1, 4, 0, 7 }進行選擇排序的實現過程如右圖
?
?
(3)插入排序
具體算法描述如下:
(4)歸并排序
歸并排序(MERGE-SORT)是利用歸并的思想實現的排序方法,該算法采用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然后遞歸求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。
分而治之
?
// 分類 -------------- 內部比較排序 // 數據結構 ---------- 數組 // 最差時間復雜度 ---- O(nlogn) // 最優時間復雜度 ---- O(nlogn) // 平均時間復雜度 ---- O(nlogn) // 所需輔助空間 ------ O(n) // 穩定性 ------------ 穩定?
?
(5)快速排序)
選擇一個基數,并且設置數組的兩端left和right,將比base大的數字放在右邊,比基數小的則放在左邊。具體操作如下:
先從右端開始,如果遇到比基數大的數字,則right--,如果遇到比基數小的數字,和A[left]進行調換,并且將left++,從左端開始。依次循環,知道left == right。此時將基數的值放在A[left]。并且在每次兩端靠近的時候,也要判斷left<right。
// 最差時間復雜度 ---- 每次選取的基準都是最大(或最小)的元素,導致每次只劃分出了一個分區,需要進行n-1次劃分才能結束遞歸,時間復雜度為O(n^2) // 最優時間復雜度 ---- 每次選取的基準都是中位數,這樣每次都均勻的劃分出兩個分區,只需要logn次劃分就能結束遞歸,時間復雜度為O(nlogn) // 平均時間復雜度 ---- O(nlogn) // 所需輔助空間 ------ 主要是遞歸造成的棧空間的使用(用來保存left和right等局部變量),取決于遞歸樹的深度,一般為O(logn),最差為O(n) // 穩定性 ---------- 不穩定(6)堆排序
步驟如下:
(1)將待排序的數組首先要變成大頂堆(從最后一個不是葉子節點開始)
? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)將最頂的元素與最后一個元素進行調換,并且使得節點數目減一
? ? ? ? ? ? ? ? ? ? ? ? ? ? (3)進行調換后,可能存在不是大頂堆的情況,調用自身函數,將其變成大頂堆
?
?
(6)希爾排序
? ? ? ??是插入排序的一種更高效的改進版本。希爾排序是不穩定的排序算法。
希爾排序是基于插入排序的以下兩點性質而提出改進方法的:
- 插入排序在對幾乎已經排好序的數據操作時,效率高,即可以達到線性排序的效率
- 但插入排序一般來說是低效的,因為插入排序每次只能將數據移動一位
希爾排序通過將比較的全部元素分為幾個區域來提升插入排序的性能。這樣可以讓一個元素可以一次性地朝最終位置前進一大步。然后算法再取越來越小的步長進行排序,算法的最后一步就是普通的插入排序,但是到了這步,需排序的數據幾乎是已排好的了(此時插入排序較快)。
假設有一個很小的數據在一個已按升序排好序的數組的末端。如果用復雜度為O(n^2)的排序(冒泡排序或直接插入排序),可能會進行n次的比較和交換才能將該數據移至正確位置。而希爾排序會用較大的步長移動數據,所以小數據只需進行少數比較和交換即可到正確位置。
轉載于:https://www.cnblogs.com/xiaoji123/p/9859026.html
總結
- 上一篇: ASP.NET Core2调用Azure
- 下一篇: android连接Mysql数据库之JD