基数排序与基数排序

基数排序与基数排序是两种非比较型排序。

计数排序:

//************计数排序*********
//先最大-最小+1得到开辟空间数,开辟空间str,在遍历原数据arr在str相应位置计数,再遍历str将值写到原arr中
//适用在密集型数据, 无重复最优可转化为位图
//时间复杂度O(N),空间复杂度O(最大数-最小数+1)

//设数组元素非负
void CountingSort(int *a, size_t size)
{
 size_t i = 0, j = 0;
 int max = a[0], min = a[0];
 size_t space = 0;
 for (i = 1; i < size; i++)
 {
  if (max < a[i])
  {
   max = a[i];
  }
  if (min > a[i])
  {
   min = a[i];
  }
 }
 space = max - min + 1;
 //str相应位置记录a中个数据的次数
 int *str = new int[space]();
 for (i = 0; i < size; i++)
 {
  str[a[i] - min] ++;
 }

 //写回原数组a中
 for (i = 0, j = 0; i < space, j < size; i++)
 {
  while (str[i]-- > 0)
  {
   a[j++] = i + min;
  }

 }
}

基数排序:

//***********基数排序**************
//采用先排低位,在排高位
//时间复杂度O(位数) 空间复杂度O(N)

//设数组元素非负
size_t GetMaxRadix(int *a, size_t size)//取数组中最大值的位数
{
 assert(a != NULL);
 size_t i = 0;
 size_t num = 0;
 size_t count = 1;
 for (i = 0; i < size; i++)
 {
  while (a[i] / count>0)
  {
   count *= 10;
   num++;
  }
 }
 return num;
}

void LSDSort(int *a, size_t size)
{
 assert(a != NULL);
 int MaxRadix = GetMaxRadix(a, size);
 int count[10] = { 0 };//同一位上数字相等的数字个数
 int start[10] = { 0 };//按位上数字所对应的起始位置
 int * bucket = new int[size];
 size_t i = 0;
 int num = 1;
 while (MaxRadix--)
 {
  memset(count, 0, sizeof(int) * 10);//count清零
  //按位排序
  
  for (i = 0; i < size;i++)//count[]
  {
   count[a[i] / num % 10]++;//取某一位上数字,在count相应位置++
  }
  for (i = 0; i < 10; i++)//start[]
  {
   //跳过0 因为起始位置一定为0
   if (i == 0)
   {
    start[i] = 0;
   }
   else
    start[i] = start[i - 1] + count[i - 1];
  }

  //写到bucket[]中
  for (i = 0; i < size; i++)
  {
   bucket[start[a[i] / num % 10]++] = a[i];
  }
  //写回a[]中
  for (i = 0; i < size; i++)
  {
   a[i] = bucket[i];
  }
  num *= 10;
 }

}

test:

 int a5[] = { 5, 24, 35, 54, 72, 81, 75, 6, 9, 56, 114, 30, 5 };
 int a6[] = { 5, 24, 35, 54, 72, 81, 75, 6, 9, 56, 114, 30, 5 };

时间: 2024-11-06 12:17:39

基数排序与基数排序的相关文章

数据结构作业之用队列实现的基数排序(Java版)

题目: 利用队列实现对某一个数据序列的排序(采用基数排序),其中对数据序列的数据(第1和第2条进行说明)和队列的存储方式(第3条进行说明)有如下的要求: 1)当数据序列是整数类型的数据的时候,数据序列中每个数据的位数不要求等宽,比 如: 1.21.12.322.44.123.2312.765.56 2)当数据序列是字符串类型的数据的时候,数据序列中每个字符串都是等宽的,比 如: "abc","bde","fad","abd",

排序算法之基数排序

概述 首先从多排序码排序开始介绍基数排序.以扑克牌排序为例.每张扑克牌有两个"排序码":花色和面值.其有序关系为: 花色:?<?<?<? 面值:2<3<4<5<6<7<8<9<10<J<Q<K<A 如果把所有扑克牌排成以下次序: ?2,-,?A,?2,-,?A,?2,-,?A,?2,-,?A 这就是多排序码排序.排序后形成的有序序列叫做字典有序序列. 一般情况下,假定有一个n个元素的序列{V0,V

基数排序_RADIXSORT

基数排序_RADIXSORT 基数排序的思想 基数排序算法实现 基于计数排序的基数排序 基于最优桶排序的基数排序 基数排序_RADIXSORT 基数排序是一种基于计数排序_COUNTINGSORT或者是最优桶排序(当然也可以基于其他排序算法,只不过计数排序对于基数排序来说应该是最快的了,因为二者的拼音都是jishupaixu,哈哈)的一种可以在线性时间O(n)完成的排序算法.博主在做基数排序的功课的时候,发现有些博文里面写到基数排序就是桶排序,我觉得基数排序和桶排序是不同的,虽然二者都用到了桶的

大话桶排序 基数排序和计数排序

一:计数排序 (1)当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k).计数排序不是比较排序,排序的速度快于任何比较排序算法.由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存.例如:计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名.但是,计数排序可以用在基数排序中的算法来排序数据范围很大的数组. (2)算法的步骤如下: 1.

计数排序+基数排序

这几天一直在写排序算法,从插入,冒泡,选择到归并和快速再到计数和基数排序.今天来写下计数排序和基数排序吧. 计数排序:对于一组小于k的数组,进行排序.这里要保证输入的关键值在[0..k]之间.貌似很简单,我们先不管什么是计数排序CountSort(A,1,n),先来看一下一段代码. CountPrint(int *A,int n,int k)代码: void CountPrint(int *A,int n,int k){//输入数组A,每个元素都小于k //C[i]用来计算i出现的次数,起初C[

【算法】计数排序、桶排序和基数排序详解

01.计数排序.桶排序与基数排序 并不是所有的排序 都是基于比较的,计数排序和基数排序就不是.基于比较排序的排序方法,其复杂度无法突破\(n\log{n}\) 的下限,但是 计数排序 桶排序 和基数排序是分布排序,他们是可以突破这个下限达到O(n)的的复杂度的. 1. 计数排序 概念 计数排序是一种稳定的线性时间排序算法.计数排序使用一个额外的数组C,使用 C[i] 来计算 i 出现的次数.然后根据数C来将原数组A中的元素排到正确的位置. 复杂度 计数排序的最坏时间复杂度.最好时间复杂度.平均时

9、【经典算法】基数排序

一.基数排序介绍 基数排序(Radix Sort)是桶排序的扩展,它的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较.具体做法是:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列. 二.基数排序图文说明 基数排序图文说明 通过基数排序对数组{53, 3, 542, 748, 14, 214, 154, 63, 616},它的示意图如下: 在上图中,首先将所有待比较

Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。

Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素).在第一部分排序完成后,再将这

20191209-八大排序之基数排序

1. 基数排序 算法核心思想 基数排序(radix sort)是一种只适用于数字或字母类型的排序方法,它检查数字或字母的每一位,将之分类,按照位数的特定顺序,来将元素排列.以数字为例,将所有元素按照个位数字分类,分类好后,将个位数字大小排列组合起来,再按照十位数字分类,再按照数字大小排列组合起来,一直到最大数位为止. 基数排序分类 基数排序的方式分为2类: LSD(Least significant digital):LSD的排序方式由键值的最右边开始,先比较最低位,也就是个位,进行分桶,分桶过