基数排序
来源:互联网 发布:usb端口坏了怎么办 编辑:程序博客网 时间:2024/06/05 17:21
<pre name="code" class="cpp">/* *2014-6-15 17:33:32 *基数排序:先从最低位开始排序,逐步向高位排序。 *优点:没有比较操作,所以很快。 **//*对于 a[9]={19,38,37,36,64,54,82,92,72}若从低位向高位逐步排列可以有效减少空间开销。1)排序个位数字,得到:a[]={82,92,72,64,54,36,37,38,19};2)排序十位数字,得到:a[]={19,36,37,38,54,64,72,82,92};若从高位向低位排序,显然38,37,36三个数需要进一步排序。1)若不开辟额外空间,(1.1)则第一次排序后:a[]={19,38,37,36,54,64,72,82,92}(1.2)继续向低位排序,a[]={72,82,92,54,64,36,37,38,19},跟没排一个样2)若开辟额外空间(2.1)对38,37,36进行额外排序,得到最终结果a[]={19,36,37,38,54,64,72,82,92};分析:38,37,36仅为两位数,其最高位相同,但是个位的排序需要开辟10个空间(0-9),用于对比,且若有43,42,41.则也需要空间,最差情况下需要 o(10^2)的空间。若数字均为n位数,则空间数最差情况下为o(10^n),所以,基数排序反常规地从低位向高位排序是一大创新。*/#include <stdio.h> #include<stdlib.h>int data[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81}; void radixSort(int[]);int main(void) { printf("\n排序前: "); int i; for(i = 0; i < 10; i++) printf("%d ", data[i]); putchar('\n'); radixSort(data); printf("\n排序后: "); for(i = 0; i < 10; i++) printf("%d ", data[i]); printf("\n\n"); return 0; } void radixSort(int data[]) { int temp[10][10] = {0}; int counter[10] = {0}; int n = 1; while(n <= 10) { int i; for(i = 0; i < 10; i++) { int lsd = ((data[i] / n) % 10); temp[lsd][counter[lsd]] = data[i]; //temp[3][0]=73;temp[3][1]=93;temp[3][2]=43,第二列++ counter[lsd]++; } // 新排列数据恢复到data[]; int k = 0; for(i = 0; i < 10; i++) { for(int j = 0; j < counter[i]; j++, k++) { data[k] = temp[i][j]; //temp[i][j]=-1;这样容易理解,但是没必要,因为碍事的数很快会被覆盖掉。} counter[i] = 0; //趁机把已用过的order赋值为0,省的下次循环。 } n *= 10; //从个位→十位→百位... } }
0 0
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 1111
- leetcode -day31 Subsets I II
- 递归创建二叉树
- jquery easyui Tab 引入页面的问题
- .net c# gif动画如何添加图片水印实现思路及代码学习
- 基数排序
- C++结构体之统计最高最低分
- Cocos2d-x JavaScript Binding结合CocosBuilder跨平台游戏开发简明教程
- 控制台颜色
- Ruby部分程序使用方法
- 反射
- ubunutu 12.04 下安装rvm
- 赵雅智_运用Bitmap和Canvas实现图片显示,缩小,旋转,水印
- 文件操作