国产探花免费观看_亚洲丰满少妇自慰呻吟_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放在對應的位置;


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南投市| 克东县| 恩平市| 思南县| 叶城县| 南川市| 清镇市| 荣昌县| 息烽县| 鹤山市| 南通市| 永川市| 洛宁县| 洪洞县| 辉县市| 长寿区| 洛阳市| 赤峰市| 合川市| 灌阳县| 朝阳市| 平利县| 鄂伦春自治旗| 乌恰县| 南丰县| 沐川县| 横山县| 商丘市| 长治县| 洱源县| 洛南县| 江安县| 邢台市| 九台市| 汾阳市| 黔西县| 玉树县| 巴青县| 房山区| 获嘉县| 大化|