国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

排序算法總結一

2019-11-08 18:34:56
字體:
來源:轉載
供稿:網友

排序在算法中是比較基礎也是相當重要的一部分,在這里將會把各種排序算法那加以總結,并實現;

排序算法分類

比較排序 冒泡排序 (穩定,時間O(n2),空間O(1))選擇排序 (穩定,時間O(n2),空間O(1))插入排序 (穩定,時間O(n2),空間O(1))shell排序 (不穩定,時間O(n1.3),空間O(1))歸并排序 (穩定,時間O(nlogn),空間O(n))快速排序 (穩定,時間O(nlogn))桶排序 (穩定,時間O(nlogn))計數排序 (穩定,時間O(kn))基數排序

堆排序 (穩定,時間O(nlogn)

注解:一般說快速排序是不穩定的, 但事實上快速排序有穩定的實現方法,故在這里認為快排也是穩定的

排序算法實現

接下來會按照以下思路去分析每種排序算法:

給出每種算法的實現思路;提供算法實現的C++源碼;代碼邏輯和值得注意的細節;

大家也可以到這個網站上找對應排序的可視化理解各種排序算法的邏輯;

冒泡排序

思路

相鄰兩個元素進行比較然后交換;

在第一輪中將最大的元素交換到數組的最后面;第二輪中將第二大的元素交換到數組的倒數第二個位置;重復上面的步驟,直至所有的元素都變換到對應的位置;

C++源碼實現

在實現中,是以函數模板的形勢實現的;利用vector存儲數組;為了方便打印每個循環中nums中的狀態,調用了algorithm庫里面的for_each函數;為了直接使用本文中的代碼,需要包含的頭文件有

#include <vector>#include <algorithm>#include <iostream>

其他的排序算法也是如此,后面就不在重述;

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交換;重復以上的步驟,直到排序完成;

C++源碼實現

template <typename T>void selectionSort(vector<T> &nums) { int index; for(size_t i = 0; i < nums.size(); i++){ index = i; for(size_t j = i; j < nums.size(); j++) { if(nums[j] < nums[index]) index = j; } swap(nums[i],nums[index]); }}

插入排序

思路

像打撲克牌一樣,將每一張牌按照大小插入到相應的位置

已經排好序的序列a0,a1,ai?1,逆序查找ai的合適位置jj位置及其后的元素依次后移,將ai插入到位置j,組成新的排好序的序列a0,a1...ai重復1、2步驟,直到排好所有的元素

上述后面兩個步驟可以整合到一起,尋找合適位置的時候,同時完成元素的移動;

C++源碼實現

template <typename T>void insertionSort(vector<T> &nums) { for(size_t i = 1; i < nums.size(); i++) { T key = nums[i]; int j = i - 1; while(j >= 0 && key < nums[j]) { nums[j+1] = nums[j]; j--; } nums[j+1] = key; }}

代碼第6行while循環就是在尋找元素key對應的位置,如果位置不對,就把元素后移一位(第7行),j遞減之后繼續循環,直到找到對應的位置,此時將key放在對應的位置;


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 正阳县| 五华县| 甘洛县| 剑川县| 周口市| 兴城市| 夏津县| 武冈市| 阿瓦提县| 衡山县| 蓝田县| 宝清县| 方城县| 沙河市| 全椒县| 赣榆县| 灯塔市| 阿鲁科尔沁旗| 昌图县| 合水县| 荆州市| 古田县| 阜阳市| 东乡县| 乌海市| 甘孜县| 栖霞市| 仪陇县| 南皮县| 集安市| 集贤县| 甘南县| 芦山县| 克拉玛依市| 玉龙| 玛曲县| 加查县| 靖江市| 阿克苏市| 徐闻县| 石狮市|