排序在算法中是比較基礎也是相當重要的一部分,在這里將會把各種排序算法那加以總結,并實現;
堆排序 (穩定,時間
注解:一般說快速排序是不穩定的, 但事實上快速排序有穩定的實現方法,故在這里認為快排也是穩定的
接下來會按照以下思路去分析每種排序算法:
給出每種算法的實現思路;提供算法實現的C++源碼;代碼邏輯和值得注意的細節;大家也可以到這個網站上找對應排序的可視化理解各種排序算法的邏輯;
相鄰兩個元素進行比較然后交換;
在第一輪中將最大的元素交換到數組的最后面;第二輪中將第二大的元素交換到數組的倒數第二個位置;重復上面的步驟,直至所有的元素都變換到對應的位置;在實現中,是以函數模板的形勢實現的;利用vector存儲數組;為了方便打印每個循環中nums中的狀態,調用了algorithm庫里面的for_each函數;為了直接使用本文中的代碼,需要包含的頭文件有
其他的排序算法也是如此,后面就不在重述;
template <typename T>void bubbleSort(vector<T> &nums){ for(size_t i = 0; i < nums.size(); i++) { //打印出每次循環后當前的nums里面的元素 for_each(nums.begin(),nums.end(),[](const int num){ cout << num << " ";} ); 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(){ vector<int> nums = {8, 10, 5, 7, 11, 9, 6, 2}; bubbleSort(nums); for_each(nums.begin(),nums.end(),[](const int num){ cout << num << " ";} ); return 0;}當測試其他排序算法的時候,只需要修改第3行調用排序算法的修改或者修改nums數組里面額數據即可;
測試結果:
8 10 5 7 11 9 6 28 5 7 10 9 6 2 115 7 8 9 6 2 10 115 7 8 6 2 9 10 115 7 6 2 8 9 10 115 6 2 7 8 9 10 115 2 6 7 8 9 10 112 5 6 7 8 9 10 112 5 6 7 8 9 10 11每次選擇最大(小)的元素放在數組的最后面(最前面)
找出A[1..n]中最小的元素,與A1交換;找出A[2..n]中最小的元素 ,與A2交換;重復以上的步驟,直到排序完成;像打撲克牌一樣,將每一張牌按照大小插入到相應的位置
已經排好序的序列上述后面兩個步驟可以整合到一起,尋找合適位置的時候,同時完成元素的移動;
代碼第6行while循環就是在尋找元素key對應的位置,如果位置不對,就把元素后移一位(第7行),j遞減之后繼續循環,直到找到對應的位置,此時將key放在對應的位置;
|
新聞熱點
疑難解答