其他分享
首页 > 其他分享> > 基数排序

基数排序

作者:互联网

排序算法可分为基于比较的排序线性时间排序(至少要遍历所有元素)。

常见的基于比较排序的算法有:冒泡排序、选择排序、插入排序、归并排序、堆排序、快速排序等。(给数字排序,需要通过两两的数字比较大小,决定他们的顺序的算法)

不基于比较的排序:受限与数据的状况。如计数排序,基数排序,桶排序。

基数排序:原理见:【算法】排序算法之基数排序 - 知乎 (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