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

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

基數排序 Radix Sort

2019-11-11 06:37:55
字體:
來源:轉載
供稿:網友

基數排序是在某種情況下比快速排序還快的排序.當然了,計數排序(Counting Sort)也有可能比快速排序快. 計數排序非常容易理解,時間復雜度是O(MAX(a[i])), 如果數據范圍很小的話,計數排序有巨大優勢. 而基數排序,則更進一步,對每一位進行計數排序. 這樣時間復雜度降為O(N*log(MAX(a[i])) 以下代碼實現了從小到大cntSort()和從大到小cntSort2().實際上也可以倒置得到從大到小,依然是O(N),代碼比較迷的地方就是output數組,記住循環順序,這個比較巧妙,具體參見 http://www.geeksforgeeks.org/radix-sort/

#include <bits/stdc++.h>using namespace std;int idx(int x, int exp){ return (x / exp) % 10;}void cntSort(int *a, int n, int exp){ int cnt[10] = {0}; int output[n]; for (int i = 0; i < n; i++) cnt[idx(a[i], exp)]++; for (int i = 1; i < 10; i++) cnt[i] += cnt[i - 1]; for (int i = n - 1; i >= 0; i--) { output[cnt[idx(a[i], exp)] - 1] = a[i]; cnt[idx(a[i], exp)]--; } for (int i = 0; i < n; i++) a[i] = output[i];}void cntSort2(int *a, int n, int exp){ int cnt[10] = {0}; int output[n]; for (int i = 0; i < n; i++) cnt[idx(a[i], exp)]++; for (int i = 8; i >= 0; i--) cnt[i] += cnt[i + 1]; for (int i = 0; i < n; i++) { output[cnt[idx(a[i], exp)] - 1] = a[i]; cnt[idx(a[i], exp)]--; } for (int i = 0; i < n; i++) a[i] = output[i];}int main(){ //freopen("in", "r", stdin); int n; scanf("%d", &n); int a[n]; int mx = 0; for (int i = 0; i < n; i++) { scanf("%d", &a[i]); mx = max(a[i], mx); } for (int exp = 1; mx / exp > 0; exp *= 10) cntSort(a, n, exp); for (int i = 0; i < n; i++) cout << a[i] << ' '; cout << endl; for (int exp = 1; mx / exp > 0; exp *= 10) cntSort2(a, n, exp); for (int i = 0; i < n; i++) cout << a[i] << ' ';}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巴里| 襄樊市| 天峻县| 武隆县| 寻乌县| 光山县| 化隆| 和龙市| 芜湖县| 平阳县| 绥宁县| 贵溪市| 万荣县| 铜梁县| 分宜县| 阳曲县| 察雅县| 云南省| 措美县| 互助| 浦城县| 高密市| 洮南市| 织金县| 美姑县| 梁平县| 咸宁市| 禹城市| 惠水县| 潮安县| 晋江市| 长沙市| 巴林左旗| 苏尼特右旗| 泰顺县| 都安| 思茅市| 新河县| 三江| 新乡市| 延寿县|