十大经典排序算法(动态演示+代码)
時間復雜度是指程序執行函數或方法的效率常用大寫的O表示,比如執行一個循環我們記做O(n),執行一個加法運算或者執行一個if操作我們記為O(1)?。
?
時間、空間復雜度比較
1 冒泡排序
算法思想:
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數。
針對所有的元素重復以上的步驟,除了最后一個。
持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
冒泡排序動圖演示
代碼:
?
2?選擇排序
算法思想:
在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾
以此類推,直到所有元素均排序完畢
選擇排序動圖演示
代碼:
?
3 插入排序
算法思想:
從第一個元素開始,該元素可以認為已經被排序
取出下一個元素,在已經排序的元素序列中從后向前掃描
如果該元素(已排序)大于新元素,將該元素移到下一位置
重復步驟3,直到找到已排序的元素小于或者等于新元素的位置
將新元素插入到該位置后
重復步驟2~5
插入排序動圖演示
代碼:
?
4 快速排序
算法思想:
選取第一個數為基準
將比基準小的數交換到前面,比基準大的數交換到后面
對左右區間重復第二步,直到各區間只有一個數
快速排序動圖演示
代碼:
?
5 堆排序
堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序算法。堆積是一個近似完全二叉樹的結構,并同時滿足堆積的性質:即子結點的鍵值或索引總是小于(或者大于)它的父節點。
算法思想:
將初始待排序關鍵字序列(R1,R2….Rn)構建成大頂堆,此堆為初始的無序區;
將堆頂元素R[1]與最后一個元素R[n]交換,此時得到新的無序區(R1,R2,……Rn-1)和新的有序區(Rn),且滿足R[1,2…n-1]<=R[n];
由于交換后新的堆頂R[1]可能違反堆的性質,因此需要對當前無序區(R1,R2,……Rn-1)調整為新堆,然后再次將R[1]與無序區最后一個元素交換,得到新的無序區(R1,R2….Rn-2)和新的有序區(Rn-1,Rn)。不斷重復此過程直到有序區的元素個數為n-1,則整個排序過程完成。
代碼:
?
6 歸并排序
歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為2路歸并。
算法思想:1.把長度為n的輸入序列分成兩個長度為n/2的子序列;2. 對這兩個子序列分別采用歸并排序;3. 將兩個排序好的子序列合并成一個最終的排序序列。
歸并排序動圖演示
代碼:
?
7?希爾排序
希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序算法。先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序.
算法思想:
選擇一個增量序列t1,t2,…,tk,其中ti>tj,tk=1;
按增量序列個數k,對序列進行k 趟排序;
每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子序列,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。
希爾排序動圖演示
代碼:
?
8?計數排序
計數排序統計小于等于該元素值的元素的個數i,于是該元素就放在目標數組的索引i位(i≥0)。
-
計數排序基于一個假設,待排序數列的所有數均為整數,且出現在(0,k)的區間之內。
-
如果 k(待排數組的最大值) 過大則會引起較大的空間復雜度,一般是用來排序 0 到 100 之間的數字的最好的算法,但是它不適合按字母順序排序人名。
-
計數排序不是比較排序,排序的速度快于任何比較排序算法。
算法思想:
找出待排序的數組中最大和最小的元素;
統計數組中每個值為 i 的元素出現的次數,存入數組 C 的第 i 項;
對所有的計數累加(從 C 中的第一個元素開始,每一項和前一項相加);
向填充目標數組:將每個元素 i 放在新數組的第 C[i] 項,每放一個元素就將 C[i] 減去 1;
計數排序動圖演示
代碼:
?
9 桶排序
將值為i的元素放入i號桶,最后依次把桶里的元素倒出來。
算法思想:
設置一個定量的數組當作空桶子。
尋訪序列,并且把項目一個一個放到對應的桶子去。
對每個不是空的桶子進行排序。
從不是空的桶子里把項目再放回原來的序列中。
桶排序動圖演示
代碼:
?
10 基數排序
一種多關鍵字的排序算法,可用桶排序實現。
算法思想:
取得數組中的最大數,并取得位數;
arr為原始數組,從最低位開始取每個位組成radix數組;
對radix進行計數排序(利用計數排序適用于小范圍數的特點)
基數排序動圖演示
代碼:
?
總結
以上是生活随笔為你收集整理的十大经典排序算法(动态演示+代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Django实现RBAC权限管理
- 下一篇: 2013-2014集训第二次个人积分赛