排序在演算法中是比較基礎也是相當重要的一部分,在這裡將會把各種排序演算法那加以總結,並實現;
桶排序 (穩定,時間o(
nlogn))
計數排序 (穩定,時間o(
kn) )
基數排序
堆排序 (穩定,時間o(
nlogn))
註解:一般說快速排序是不穩定的, 但事實上快速排序有穩定的實現方法,故在這裡認為快排也是穩定的
接下來會按照以下思路去分析每種排序演算法:
大家也可以到這個**上找對應排序的視覺化理解各種排序演算法的邏輯;
相鄰兩個元素進行比較然後交換;
在實現中,是以函式模板的形勢實現的;利用vector
儲存陣列;為了方便列印每個迴圈中nums中的狀態,呼叫了algorithm
庫裡面的for_each
函式;為了直接使用本文中的**,需要包含的標頭檔案有
#include
#include
#include
其他的排序演算法也是如此,後面就不在重述;
template
void bubblesort(vector
&nums) );
cout
<< endl;
for(size_t j = 1; j + i < nums.size(); j++)
if(nums[j-1] > nums[j]) // keep stable
swap(nums[j-1],nums[j]);
}}
第5行**主要是為了方便列印每次迴圈後,陣列裡面的元素變化的狀態,真正實現的時候,可以刪掉這一行**;第8行中,要注意符號,這個將會與排序演算法是否穩定有一定關係
為了測試氣泡排序,主函式**如下:
int main()
; bubblesort(nums);
for_each(nums.begin(),nums.end(),(const
int num) );
return
0;}
當測試其他排序演算法的時候,只需要修改第3行呼叫排序演算法的修改或者修改nums陣列裡面額資料即可;
測試結果:
8 10 5 7 11 9 6 2
8 5 7 10 9 6 2 11
5 7 8 9 6 2 10 11
5 7 8 6 2 9 10 11
5 7 6 2 8 9 10 11
5 6 2 7 8 9 10 11
5 2 6 7 8 9 10 11
2 5 6 7 8 9 10 11
2 5 6 7 8 9 10 11
每次選擇最大(小)的元素放在陣列的最後面(最前面)
找出a[1..n]中最小的元素,與a1交換;
找出a[2..n]中最小的元素 ,與a2交換;
重複以上的步驟,直到排序完成;
template
void selectionsort(vector
&nums)
swap(nums[i],nums[index]);
}}
像打撲克牌一樣,將每一張牌按照大小插入到相應的位置
已經排好序的序列a0
,a1,
ai−1
,逆序查詢ai
的合適位置
j 將j
位置及其後的元素依次後移,將ai
插入到位置j,組成新的排好序的序列a0
,a1.
..ai
重複1、2步驟,直到排好所有的元素
上述後面兩個步驟可以整合到一起,尋找合適位置的時候,同時完成元素的移動;
template
void insertionsort(vector
&nums)
nums[j+1] = key;
}}
**第6行while
迴圈就是在尋找元素key對應的位置,如果位置不對,就把元素後移一位(第7行),j遞減之後繼續迴圈,直到找到對應的位置,此時將key放在對應的位置;
常見排序演算法總結(一)
這裡的排序演算法指內排序演算法,即在記憶體中排序 所謂排序為部分有序到全域性有序的過程,以下排序都以從小到大為例 1.直接插入排序 思想 好像打撲克牌一樣,尋找正確的位置插入,分三步走。一 尋找合適的位置。二 將後面的數往後移一位,騰出空間。三 插入 public class insortdemo ...
排序演算法總結篇(一)
前言 在學習過程中,演算法是我們繞不過去的檻,可能我們沒有特體經過系統的學習,但是,實際上平時的 中已經體現了很多的演算法思想,以中興演算法大賽2017年中興演算法大賽 迪傑特斯拉派為列,裡面自己其實用到了很多演算法,只是自己並沒有將它與理論結合起來看。1.概述 首先,我們來看一張經典的圖,這張圖很...
JS排序演算法總結 (一)氣泡排序
目的 掌握氣泡排序的基本思想與過程 實現 時間複雜度與優化 1 基本思想與過程 從後向前兩兩比教,大數下沉,小數冒泡,一輪比較後,最小數的位置就排好了,在第乙個位置。重複上述過程,依次將第2.3.n 1個最小數排好位置。2 實現 function bubblesort arr console.log...