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

基数排序

时间:2023-09-02 10:33:07浏览次数:29  
标签:sort 10 63 int 54 基数排序 exp

 

基数排序,不是基于比较的排序。

过程如下:

处理过程:

 

 桶排过程:

 1 void Bucket_sort(int a[],int exp)//exp为1按个位排序,exp为10按十位排序,exp为100按个位排序,…… 
 2 {
 3     vector<int>Bucket[20]; 
 4     
 5     //按位入桶 ,+10 是为了对付负数 
 6     for(int i=0;i<n;i++){
 7         int pos=a[i]/exp%10;
 8         Bucket[pos+10].push_back(a[i]);
 9     }
10     
11     //将每个桶中的数安顺序还给数组 
12     int k=0;
13     for(int pos=0;pos<=19;pos++) //升序,若要倒序可以反过来给数组。 
14     {
15        for(int j=0;j<Bucket[pos].size();j++){
16                a[k++]=Bucket[pos][j];
17        }
18     } 
19 }

 

整体代码:

 1 /*
 2 
 3 16
 4 -53 -3 -54 74 48 18 -24 54 63 663 -9 9 19 -9999 0 789 
 5 
 6 
 7 before sort:-53 -3 -54 74 48 18 -24 54 63 663 -9 9 19 -9999 0 789
 8 after  sort:-9999 -54 -53 -24 -9 -3 0 9 18 19 48 54 63 74 663 789
 9 
10 */
11 
12 
13 #include<bits/stdc++.h>
14 using namespace std;
15 #define LL long long
16 
17 const int N = 255;
18 int a[N];
19 int n; 
20 
21 int getmax(int a[]){
22     int maxa=abs(a[0]);
23     for(int i=1;i<n;i++) maxa=max(maxa, abs(a[i]));
24     return maxa;
25 }
26 
27 void Bucket_sort(int a[],int exp)
28 {
29     vector<int>Bucket[20]; 
30     
31     //按位入桶 +10 是为了对付负数 
32     for(int i=0;i<n;i++){
33         int pos=a[i]/exp%10;
34         Bucket[pos+10].push_back(a[i]);
35     }
36     
37     //将每个桶中的数安顺序倒给数组 
38     int k=0;
39     for(int pos=0;pos<=19;pos++) //升序,若要倒序可以反过来给数组。 
40     {
41        for(int j=0;j<Bucket[pos].size();j++){
42                a[k++]=Bucket[pos][j];
43        }
44     } 
45 }
46 
47 
48 int main()
49 {
50     cin>>n;
51     for (int i=0; i<n; i++) cin >> a[i] ;
52     
53     cout << "before sort:";
54     for (int i=0; i<n; i++) cout << a[i] << " ";
55     cout << endl;
56     
57     
58     //基数排序 
59     int maxa=getmax(a);
60     for(int exp=1;maxa/exp>0;exp*=10)
61         Bucket_sort(a,exp);
62     
63     cout << "after  sort:";
64     for (int i=0; i<n; i++) cout << a[i] << " ";
65     cout << endl;
66     
67 
68 
69     return 0;
70 }

 

 

 

标签:sort,10,63,int,54,基数排序,exp
From: https://www.cnblogs.com/flatte/p/17673297.html

相关文章

  • 【数据结构】排序 归并排序和基数排序
    1.归并排序归并排序中的"归并"的意义就是把多个有序表合并为一个新的有序表。算法思想:二路归并排序:初始情况下将长度为n的待排序表分为n个子表,则每个子表的长度为1,是有序的。每趟排序尽量将这些子表按位置相邻两两归并,重复直到合并为一个长度为n的有序表为止。具体实现:在归......
  • 归并,基数排序及排序分析
    归并,基数排序及排序分析归并排序将两个或两个以上的有序子序列"归并"为一个有序的序列.归并排序的演示归并需要logn趟如何将两个有序序列合成一个有序序列?使用前面学的两个线性表的合并在同一个有序序列里面的合并操作归并排序算法分析归并排序方法的比较基数......
  • 基数排序
    博客地址:https://www.cnblogs.com/zylyehuo/#-*-coding:utf-8-*-#O(n)O(kn)#NBO(nlogn)importrandomdefpartition(li,left,right):tmp=li[left]whileleft<right:whileleft<rightandli[right]>=tmp:#从右面找比tmp小的数......
  • 基数排序详解
    基数排序详解1)前言:计数排序要学基数排序,掌握计数排序非常重要。计数排序的原理十分的简单。举个例子,排序52413,你打算怎么办?很简单是不是,冒泡排序、选择排序、归并排序……这些都足以解决。但如果你有100000000个数要排序,你可能就要束手就擒了。那如归这时候我告诉你:这1000......
  • 基数排序
    最近又有个奇奇怪怪的题目,数据为\(n\le1\times10^7\),并且还要用到排序,普通的排序肯定会超时,然后就发现了一种\(O(n)\)介绍基数排序(RadixSort)是桶排序的扩展,它是将整数按位数切割成不同的数字,然后按每个数位分别比较以此来排序。说详细点,也就是将所有数字统一为同样的......
  • 基本算法-基数排序
    思想当我们需要对一组数据进行排序时,常规的排序算法(如快速排序、归并排序等)通常是比较排序,即通过比较元素之间的大小关系来进行排序。但有时候我们需要对一组数据按照它们的“数字位”进行排序,此时比较排序并不是最优的选择,这时候基数排序就显得非常有效了。基数排序是一种非比......
  • 排序算法-基数排序
    基数排序RadixSort1.RadixSort介绍RadixSort属于“分配式排序”(DistributionSort),又称“桶子法”(BucketSort),其是通过比较待排序序列的所有元素的各个位的值,将元素分配至“桶”中,以达到排序的目的。RadixSort是一种效率较高且稳定的排序算法,其是桶排序的扩展。RadixSor......
  • Java中常用排序算法及示例-冒泡排序、希尔排序、选择排序、插入排序、合并排序、基数
    场景Java中需要对数据进行排序处理,常用的排序算法以及示例进行归纳整理。注:实现1、冒泡排序冒泡排序法又称为交换排序法,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较。如此扫描一次之后就可以确保最后一个元素位于正确的顺序,接着逐步进......
  • Java中常用排序算法及示例-冒泡排序、希尔排序、选择排序、插入排序、合并排序、基数
    场景Java中需要对数据进行排序处理,常用的排序算法以及示例进行归纳整理。注:博客:https://blog.csdn.net/badao_liumang_qizhi实现1、冒泡排序冒泡排序法又称为交换排序法,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较。如此扫描......
  • 【基数排序算法详解】Java/Go/Python/JS/C不同语言实现
    说明基数排序(RadixSort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的......