数据结构排序-基数排序

基数排序是跟前面的几种排序算法完全不一样的排序算法,前面的排序算法主要通过关键字之间的比较和移动来实现,而基数排序不需要进行关键字之间的比较,它是借助多关键字的思想来实现的。对于数字,每一位上的数字就是一个关键字,每一位的数字范围就是关键字范围,它的主要过程为:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列,如下图所示。类似从低位到高位比较,就是从次关键字到主关键字比较,这种称为最低位优先(LSD),反之称为最高位优先(MSD)。时间复杂度为O(kn)。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 int n;    //元素个数
 5 int bit_num;    //最大数字位数
 6
 7 /*
 8  * 获取相应位置上的数(从右到左)
 9  */
10 int GetNumInPos(int num, int pos)
11 {
12     int i, temp = 1;
13     for (i = 0; i < pos - 1; i++)
14     {
15         temp *= 10;
16     }
17     return (num / temp) % 10;
18 }
19
20 /*
21  * 基数排序(LSD)
22  */
23 void RadixSort(int *array)
24 {
25     int radix = 10;
26     int *count, *bucket, i, j, k;
27     count = (int*) malloc(sizeof(int) * radix);
28     bucket = (int*) malloc(sizeof(int) * n);
29     for (k = 1; k <= bit_num; k++)
30     {
31         for (i = 0; i < radix; i++)
32         {
33             count[i] = 0;
34         }
35         //统计各个桶中所盛数据个数
36         for (i = 0; i < n; i++)
37         {
38             count[GetNumInPos(array[i], k)]++;
39         }
40         //count[i]表示第i个桶的右边界索引
41         for (i = 1; i < radix; i++)
42         {
43             count[i] = count[i] + count[i - 1];
44         }
45         //分配
46         for (i = n - 1; i >= 0; i--)
47         {
48             j = GetNumInPos(array[i], k);
49             bucket[count[j] - 1] = array[i];
50             count[j]--;
51         }
52         //收集
53         for (i = 0, j = 0; i < n; i++, j++)
54         {
55             array[i] = bucket[j];
56         }
57     }
58 }
59
60 int main()
61 {
62     int i;
63     int *array;
64     printf("请输入最大数字的位数:");
65     scanf("%d", &bit_num);
66     printf("请输入数组的大小:");
67     scanf("%d", &n);
68     array = (int*) malloc(sizeof(int) * n);
69     printf("请输入数据(用空格分隔):");
70     for (i = 0; i < n; i++)
71     {
72         scanf("%d", &array[i]);
73     }
74     RadixSort(array);
75     printf("排序后为:");
76     for (i = 0; i < n; i++)
77     {
78         printf("%d ", array[i]);
79     }
80     printf("\n");
81 }
时间: 2024-10-03 01:49:22

数据结构排序-基数排序的相关文章

黑马程序员——数据结构排序算法总结

-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 下面是几个网上常见的总结图: 有些不同之处:集中在希尔排序的时间复杂度.快速归并的空间复杂度上 个人总结口诀: 选择N方-->选择排序的最好最坏平均都N方 插入冒泡最好N-->插入冒泡的最好是N,其他是N方 归并堆n乘logN-->归并希尔堆的最好最坏平均都是n乘logN 快速最坏N方-->快速排序的最坏是N方,其他是n乘logN 快速选择希尔堆不稳定-->

数据结构--排序

插入排序(上)     基本思想:每次将一个待排序的的元素,按其关键字大小插入到已经排好序的子表的适当位置,直到全部元素插完为止.直接插入排序    简写排序思路:     假设待排序的元素存放在R[0.....n-1]中,在排序过程中,将R划分为两个区间,分别为R[0.....i-1]和R[i....n-1](刚开始时i=1,有序区只有R[0]一个元素),    其中,前一个子区间即是一个已经排好序的子区间,即有序区,后一个子区间则是一个待排序的无序区.   直接插入排序的操作即是:将当前无序

常见的排序算法(四)( 归并排序,计数排序 , 基数排序)

 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,称为二路归并. (如果读者不太了解什么叫分治法,可以去看看<算法导论>第一二章.) 归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1:否则将第

数据结构排序算法Java实现

闲的无聊又拿起了大学的数据结构的书看起来 <数据结构(c语言版)>严蔚敏 吴伟民编著. 里面有几个排序算法,感觉挺好玩的,就想着写出来玩玩. package test.sort; /** * @Title: TODO * @Description: TODO * @author: * @date: 2014-8-10 上午11:20:43 * */ public class quickSort { private static int datas[] = {23,42,12,45,56,63,

20175314薛勐 数据结构-排序(选做)

数据结构-排序(选做) 要求 在数据结构和算法中,排序是很重要的操作,要让一个类可以进行排序,有两种方法: 有类的源代码,针对某一成员变量排序,让类实现Comparable接口,调用Collection.sort(List) 没有类的源代码,或者多种排序,新建一个类,实现Comparator接口 调用Collection.sort(List, Compatator) 针对下面的Student类,使用Comparator编程完成以下功能: 在测试类StudentTest中新建学生列表,包括自己和学

数据结构-排序(选做) 20175204

数据结构-排序(选做) 任务要求 在数据结构和算法中,排序是很重要的操作,要让一个类可以进行排序,有两种方法: 有类的源代码,针对某一成员变量排序,让类实现Comparable接口,调用Collection.sort(List) 没有类的源代码,或者多种排序,新建一个类,实现Comparator接口 调用Collection.sort(List, Compatator) 针对下面的Student类,使用Comparator编程完成以下功能: 在测试类StudentTest中新建学生列表,包括自己

数据结构--排序(下)--基数排序

基数排序 前面的算法有一个公关特点,就是基于比较大小来排序的.最坏情况NlogN,除了比较外,在做个些别的事情. 桶排序 假设我们有N个学生,他们的成绩是0到100之间的整数(于是有M=101个不同的成绩值).如何在线性时间内将学生按成绩排序? 建立101个桶 void Bucket_Sort(ElementType A[], int N) { count[]初始化; while (读入1个学生成绩grade) 将该生插入count[grade]链表; for ( i=0; i<M; i++ )

数据结构-排序算法总结

排序算法 算法分析 算法稳定性 如果一种排序算法不会改变关键码值相同的记录的相对顺序,则称为稳定的(stable) 不稳定的算法在某种条件下可以变为稳定的算法,而稳定的算法在某种条件下也可以变为不稳定的算法.例如,对于冒泡排序算法,原本是稳定的排序算法,如果将记录交换的条件改成a[j].key>=a[j+1].key,则两个相等的记录就会交换位置.再如,快速排序原本是不稳定的排序方法,但若待排序记录中只有一组具有相同关键码的记录,而选择的轴值恰好是这组相同关键码中的一个,此时的快速排序就是稳定的

桶排序/基数排序(Radix Sort)

说基数排序之前,我们先说桶排序: 基本思想:是将阵列分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序).桶排序是鸽巢排序的一种归纳结果.当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n)).但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响.          简单来说,就是把数据分组,放在一个个的桶中,然后对每个桶里面的在进行排序. 例如要对大小为[1..1000]范围内的n个整数A[1..n]排序 首