基数排序
作者:互联网
排序算法可分为基于比较的排序和线性时间排序(至少要遍历所有元素)。
常见的基于比较排序的算法有:冒泡排序、选择排序、插入排序、归并排序、堆排序、快速排序等。(给数字排序,需要通过两两的数字比较大小,决定他们的顺序的算法)
不基于比较的排序:受限与数据的状况。如计数排序,基数排序,桶排序。
基数排序:原理见:【算法】排序算法之基数排序 - 知乎 (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