标签:10 arr int mymax 基数排序 排序 left
排序算法可分为基于比较的排序和线性时间排序(至少要遍历所有元素)。
常见的基于比较排序的算法有:冒泡排序、选择排序、插入排序、归并排序、堆排序、快速排序等。(给数字排序,需要通过两两的数字比较大小,决定他们的顺序的算法)
不基于比较的排序:受限与数据的状况。如计数排序,基数排序,桶排序。
基数排序:原理见:【算法】排序算法之基数排序 - 知乎 (zhihu.com)
给出代码:
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 //基排序 6 class radixSort { 7 8 public: 9 radixSort() = default; 10 void Sort(vector<int>& arr) { 11 if (arr.size() < 2) return; 12 //left,right来决定排序的范围,左闭右闭。 13 Sort(arr, 0, arr.size() - 1, maxbits(arr)); 14 } 15 16 //返回最大的数字有几位,位数决定需要入桶出桶的次数。每次入桶都会排好一位位数的顺序。 17 int maxbits(vector<int> arr) { 18 int mymax = INT_MIN; 19 for (int i = 0; i < arr.size(); i++) { 20 mymax = max(mymax, arr[i]); 21 } 22 int res = 0; 23 while (mymax != 0) { 24 res++; 25 mymax /= 10; 26 } 27 return res; 28 } 29 30 //获得一个数在d位上的数; 31 int getDigit(int num, int d) { 32 return ((num/(int)pow(10,d-1)) % 10); 33 } 34 35 void Sort(vector<int> & arr, int left, int right, int digit) { 36 //基,为10;默认传入的是10进制的数; 37 const int radix = 10; 38 int i = 0; 39 int j = 0; 40 //实际是没有桶的,是用辅助空间help来模拟出桶入桶的 41 vector<int> help(right - left + 1, 0); 42 for (int d = 1; d <= digit; ++d) { 43 vector<int> count(radix, 0); 44 //count[0]表示当前位(i)是0的数字的个数; 45 for (i = left; i <= right; i++) { 46 j = getDigit(arr[i], d); 47 count[j]++; 48 } 49 //对count 数组改成前缀 50 for (i = 1; i < radix; i++) { 51 count[i] = count[i] + count[i - 1]; 52 } 53 //从右往左倒出来 54 for (i = right; i >= left; i--) { 55 j = getDigit(arr[i], d); 56 help[count[j] - 1] = arr[i]; 57 count[j]--; 58 } 59 //把排好序的数组传回arr,准备下一位的排序 60 for (i = left, j = 0; i <= right; i++, j++) { 61 arr[i] = help[j]; 62 } 63 } 64 } 65 }; 66 67 int main() { 68 radixSort * a = new radixSort(); 69 vector<int> nums ={200,154,324,90,1,5438}; 70 a->Sort(nums); 71 return 0; 72 }
标签:10,arr,int,mymax,基数排序,排序,left 来源: https://www.cnblogs.com/cotoyo25/p/16218540.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。