首页 > 代码库 > 《数据结构与算法分析:C语言描述》复习——第六章“排序”——基数排序
《数据结构与算法分析:C语言描述》复习——第六章“排序”——基数排序
2014.06.17 06:42
简介:
基数排序是一种非比较算法,通过多轮的分配与合并来排序整个数组。应用范围比较窄,根据Wikipedia的说法,它只适合整数排序。
描述:
基数排序和桶排序有点类似,都是将元素按照特定依据分配到多个桶中。但它和桶排序的区别,在于它要进行不止一次的分配与合并。每次分配元素所用的“依据”是元素的某一位数字,分配按照由低位到高位的顺序进行。教材中和我搜到的一些资料中都只给出了整数数组的示例,我也暂时没想清楚基数排序能否应用到其他数据类型上。
排序:
1 // My implementation for radix sort. 2 #include <algorithm> 3 #include <iostream> 4 #include <vector> 5 using namespace std; 6 7 void radixSort(vector<int> &v) 8 { 9 int n, i, j, k;10 int max_val;11 vector<vector<int> > rad;12 13 n = (int)v.size();14 if (n <= 1) {15 return;16 }17 18 // This algorithm works for negative integers.19 max_val = abs(v[0]);20 for (i = 1; i < n; ++i) {21 max_val = max(abs(v[i]), max_val);22 }23 24 int exp = 1;25 while (max_val / exp >= 10) {26 exp *= 10;27 }28 29 rad.resize(19);30 int iexp = 1;31 while (true) {32 for (i = 0; i < n; ++i) {33 rad[v[i] / iexp % 10 + 9].push_back(v[i]);34 }35 36 k = 0;37 for (i = 0; i < 19; ++i) {38 int n2 = (int)rad[i].size();39 for (j = 0; j < n2; ++j) {40 v[k++] = rad[i][j];41 }42 rad[i].clear();43 }44 45 if (iexp == exp) {46 break;47 } else {48 iexp *= 10;49 }50 }51 rad.clear();52 }53 54 int main()55 {56 vector<int> v;57 int n, i;58 59 while (cin >> n && n > 0) {60 v.resize(n);61 for (i = 0; i < n; ++i) {62 cin >> v[i];63 }64 radixSort(v);65 for (i = 0; i < n; ++i) {66 cout << v[i] << ‘ ‘;67 }68 cout << endl;69 }70 71 return 0;72 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。