【Sort】RadixSort基数排序
太晚了,明天有时间在写算法思路,先贴代码
————————————————————————————————————————————————
刚答辩完,毕业好难,感觉自己好水
————————————————————————————————————————————————
解题思路:
由低位到高位进行排序,比如数组33,22,11,44,67,76,95,98,89,107,最大的数107,也就是需要
三趟排序:
1.相同位置上的数字按照大小排序
2.相同位置上,相同大小的数字按照发现的先后排序。
第一趟,按照个位进行排序,排序后的结果为:11,22,33,44,95,76,67,107,98,89
第二趟,按照十位进行排序,排序后的结果为:107,11,22,33,44,67,76,89,95,98
第三趟,按照百位进行排序,排序后的结果为,11,22,33,44,67,76,89,95,98,107
时间复杂度为O(M*5N),需要线性的外部空间,实际使用中应该较少,不过这种方法的
变种应该挺有用,比如位排序(http://www.cnblogs.com/fcyworld/p/6147042.html)
#include <iostream> using std::cout; void radixsort(int *a,int num);
int loop(int *a,int num);
int main()
{
int a[]={,,1,,,,,9,8,107};
radixsort(a,);
for(int i=;i<;i++)
cout<<a[i]<<" ";
return ;
}
int loop(int *a,int num)
{
int maxnum=,i;
for(i=;i<num;i++)
if(a[i]>maxnum)
maxnum=a[i];
i=;
maxnum/=;
while(maxnum>)
{
i++;
maxnum/=;
}
return i;
}
void radixsort(int *a,int num)
{
int looptime=loop(a,num);
int *counts=new int[];
int *tmp=new int[num];
int i,j,k,rs=;
for(j=;j<looptime;j++)
{
for(i=;i<;i++)
counts[i]=;
for(i=;i<num;i++)
{
k=(a[i]/rs)%;
counts[k]++;
}
for(i=;i<;i++)
counts[i]+=counts[i-]; //确定每个数字出现的次数以及范围,
//比如counts[0]=3,counts[1]=5,
//那么数字1应该保存的位置就应该在索引8以下,
//而数字1出现的次数由原数组中计算,感觉这个方法很巧妙
for(i=;i<num;i++)
{
k=(a[i]/rs)%; //计算每个数字应该保存的位置
tmp[counts[k]-]=a[i]; //
counts[k]--;
}
for(i=;i<num;i++)
a[i]=tmp[i];
rs*=;
}
delete[]tmp;
delete[]counts;
}
【Sort】RadixSort基数排序的更多相关文章
- 【sort】 基数排序
下面这段问答摘自csdn: 把基数排序说成桶排序应该是没有太大问题的.总的说来,应该把这一类归为分配排序,由于分配排序的一些缺陷,主要是时间代价很差,改进成为桶式排序(bucket sort),而桶排 ...
- 非常无聊——STD::sort VS 基数排序
众所周知,Std::sort()是一个非常快速的排序算法,它基于快排,但又有所修改.一般来说用它就挺快的了,代码一行,时间复杂度O(nlogn)(难道不是大叫一声“老子要排序!!”就排好了么...). ...
- 【UVA 11462】 Age Sort(基数排序)
题 题意 给你最多2000000个数据,大小是1到99的数,让你排序输出. 分析 快排也可以过.不过这题本意是要基数排序(桶排序),就是读入年龄age, a[age]++,然后输出时,从1到99岁(看 ...
- java的八大排序
public class Sort2 { public static void main(String[] args) { Sort2 sort = new Sort2(); System.out.p ...
- java八大排序代码
import java.util.ArrayList;import java.util.List; public class FastSort { public static void main(St ...
- 【算法】基数排序(Radix Sort)(十)
基数排序(Radix Sort) 基数排序是按照低位先排序,然后收集:再按照高位排序,然后再收集:依次类推,直到最高位.有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序.最后的次序就 ...
- java-数组排序--计数排序、桶排序、基数排序
计数排序引入 不难发现不论是冒泡排序还是插入排序,其排序方法都是通过对每一个数进行两两比较进行排序的,这种方法称为比较排序,实际上对每个数的两两比较严重影响了其效率,理论上比较排序时间复杂度的最低下限 ...
- 十大经典排序算法+sort排序
本文转自:十大经典排序算法,其中有动图+代码详解,本文简单介绍+个人理解. 排序算法 经典的算法问题,也是面试过程中经常被问到的问题.排序算法简单分类如下: 这些排序算法的时间复杂度等参数如下: 其中 ...
- 排序算法-基数排序(Java)
package com.rao.sort; import java.util.*; /** * @author Srao * @className RadioSort * @date 2019/12/ ...
随机推荐
- MFC中CListCtrl说明
转载:http://blog.csdn.NET/lhy2199/article/details/5177032 listctrl默认view 风格为report CListCtrl类封装"列 ...
- Time.timeScale、游戏暂停
原文链接 项目里面一直在用Time.timeScale来做游戏的 1倍 2倍整体加速,今天我仔细看了一下Time.timeScale才发现之前我理解错了一些东西. Time.timeScale可以控制 ...
- C# EnumHelper
using System; using System.Collections.Generic; using System.ComponentModel; using System.Reflection ...
- 循序渐进看Java web日志跟踪(2)-Java日志API认识
接触过Java的朋友应该都会知道,java的开源框架百花齐放,实现同样的功能,总能找到几个强大的开源框架来进行选择.在日志方面,Java同样不逊色.除了JDK本身自带的简单的日志工具,java还有如l ...
- linux统计单词数
sort +awk+uniq 统计文件中出现次数最多的前10个单词 实例 cat logt.log|sort -s -t '-' -k1n |awk '{print $1;}'|uniq -c|sor ...
- java 生成二维码
package com.sun.erwei; import java.awt.Graphics2D;import java.awt.geom.AffineTransform;import java.a ...
- transient关键字小结
java中实现序列化有两种实现方式,一种是自动的,只要实现Serilizable接口,另一种是需要手动指定需要序列化的成员变量,实现Externalizable接口. transient的特点: 1. ...
- oc加载动态图片
NSString *name = @"qianming.gif"; NSString *filePath = [[NSBundle bundleWithPath:[[NSBundl ...
- Introduction to Programming Contests (stanford)
http://web.stanford.edu/class/cs9http://web.stanford.edu/class/cs97si/7si/
- postgreSQL-如何查数据库表、字段以及字段类型、注释等信息?
之前从网上也搜索了一些关于postgreSQL的系统表含义以及如何查表相关信息,但是都没有一个完整的内容,所以自己将找到的一些内容作了下整合,大家可以根据自己需要再对sql进行调整. --1.查询对象 ...