排序算法之(6)——基数排序

【基数排序的思想】

首先使用基数r=10进行分解,将每个整数分成d位(d是待排元素中的最大位数),每位的取值范围是0~9;因为每一位有10种可能的情况,所以建立10个链表,即lists[0]~list[9],分别代表相应位为0、1、2、3、4、5、6、7、8、9。然后执行下列步骤:

(1)第一趟:按照个位数,将元素放入相应链表中,若元素的个数为0,则放入链表lists[0]中,若元素的个数为1,则放入链表lists[1]中………………;然后按照链表的顺序(lists[0]->list[1]->list[2]………….)将链表中的元素重新拿出来,此时全部元素已经按个位排好序。

(2)第二趟:将(1)得到的整数序列按照十位数,将元素放入相应链表中,若元素的十数为0,则放入链表lists[0]中,若元素的十数为1,则放入链表lists[1]中………………;然后按照链表的顺序(lists[0]->list[1]->list[2]………….)将链表中的元素重新拿出来,此时全部元素也按十位排好序。

.

.

.

.

总共进行d趟排序。

经过d趟排序后,此时所有元素的每一位都排好序,即所有元素有序。

【代码实现】

#include<iostream>
#include<list>
using namespace std;
int maxdigit(int data[],int n)
{
  int d=1;
  int p=10;
  for(int i=0;i<n;i++)
  {
    while(data[i]>=p)
    {
      p=p*10;
      d++;
    }
  }
  return d;
}
void radixsort(int data[],int n)
{
   int digits=maxdigit(data,n);
   list<int> lists[10];  //基数为10,定义10个链表
   //---依次按个位、十位、百位....进行排序----
   for(int d=1,factor=1;d<=digits;factor*=10,d++)
   {
       //-----元素进链表----
       for(int j=0;j<n;j++)
       {
         lists[(data[j]/factor)%10].push_back(data[j]); //根据元素的相应位进链表
       }
       //---把链表里的元素重新拿出来---
       int k=0;
       for(int j=0;j<10;j++)
       {
         while(!lists[j].empty())
         {
          data[k]=lists[j].front();
          lists[j].pop_front();
          k++;
         }
       }
       //---查看中间结果----
       cout<<"第"<<d<<"趟结果:";
      for(int i=0;i<n;i++)
      {
        cout<<data[i]<<" ";
      }
      cout<<endl;
   }
}
int main()
{
    int data[10]={170, 201, 45, 2, 789, 4, 456, 56, 8, 47};
    radixsort(data,10);
    cout<<"排序结果:";
    for(int i=0;i<10;i++)
    {
     cout<<data[i]<<" ";
    }
    cout<<endl;
    system("pause");
    return 0;
}

【程序结果】

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 06:15:00

排序算法之(6)——基数排序的相关文章

排序算法七:基数排序(Radix sort)

上一篇提到了计数排序,它在输入序列元素的取值范围较小时,表现不俗.但是,现实生活中不总是满足这个条件,比如最大整形数据可以达到231-1,这样就存在2个问题: 1)因为m的值很大,不再满足m=O(n),计数排序的时间复杂也就不再是线性的: 2)当m很大时,为计数数组申请的内存空间会很大: 为解决这两个问题,本篇讨论基数排序(Radix sort),基数排列的思想是: 1)将先按照某个基数将输入序列的每个元素划分成若干部分,每个部分对排序结果的影响是有优先级的: 2)先按低优先级排序,再按高优先级

常见排序算法导读(10)[基数排序]

与前面介绍的7种排序算法不同,基数排序(Radix Sort)是基于多关键字排序的一种排序算法.也就是说,前面介绍的7种排序算法是建立在对单个元素关键字比较的基础之上,而基数排序则是采用"分配"与"收集"的办法,用对多关键字进行排序的思想实现对单个关键字的排序. 基数排序的典型例子当然就是扑克牌排序啦,几乎所有的数据结构教科书都会讲到,原因是形象易懂.每张扑克牌都有两个关键字:花色和面值.假定有序关系为: 花色: 黑桃 < 红桃 < 梅花 < 方块

排序算法大全之基数排序

排序算法大全之--基数排序 基数排序是一种分配式排序,又成为桶子法排序 LSD(我们以最低位优先) 第一步:假设原有一串数字如下: 23,45,12,32,43 遍历这些数的个位数字,将他们分别装进编号为0到9的桶中 桶  0:为空,因为这些数中没有个位数为0的 桶  1:空 桶  2:12,32 桶  3:23,43 桶  4:空 桶  5:45 桶  6:空 桶  7:空 桶  8:空 桶  9:空 第二步 接下来将这些桶中的数据依次串起来,排成一排: 12,32,23,43,45 接下来,

排序算法六(基数排序)

一.原理介绍 所谓的基数排序算法,即使对于待排序数据,将其看做数据数位相同的数据. 随后一次依据每个数字个位大小排序,重新排序之后,再根据每一个数字的十位大小排序,依次进行,最后数据就可以达到一个整体有序的状态. 二.实例 对于这样的一系列数据: int arr[15] = { 123, 234, 543, 324, 568, 975, 547, 672, 783, 239,124,567,865,579,532 }; 我们依次检索个位,统计每一个数据的个位数,依次放置在 0-9 九个格子里,代

排序算法之JAVA基数排序算法

package net.qh.test.sort; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2016/03/07. */ public class Radix { public static int[] asc( int[] array ){ int index = 1; /** 最大数字位数(如100为3位数字,2000为4位数字) */ /** 取得最大数字位数

【数据结构】非比较排序算法(实现计数排序和基数排序)

● 计数排序 1.算法思想: 计数排序是直接定址法的变形.通过开辟一定大小的空间,统计相同数据出现的次数,然后回写到原序列中. 2.步骤: 1)找到序列中的最大和最小数据,确定开辟的空间大小. 2)开辟空间,利用开辟的空间存放各数据的个数. 3)将排好序的序列回写到原序列中. 具体实现如下: void CountSort(int *arr, int size) {  assert(arr);  int min = arr[0];  int max = arr[0];  int num = 0;

常见的排序算法

描述: 排序算法可谓数据结构模块中的重中之重,常见的哈希表,二叉树,搜索树/平衡树,位图等数据结构只是处理实际问题的抽象方法,实际在处理接受或生成的数据集时,排序算法显得尤其重要,排序算法家族很庞大,其中包括了冒泡排序,选择排序,插入排序,堆排序,快速排序,归并排序,基数排序,计数排序,希尔排序,箱排序,树型排序等众多算法,每种排序都有各自的特性,没有好坏之分,只有在特定的场景使用合适的排序算法才是上策,单纯的来比显得太过绝对,没有可比性.因为实际需求及各方面条件的限制使得排序算法的可选范围往往

排序算法汇总(C/C++实现)

前言:     本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的校级赛.区域赛.没什么惊天动地的奖项,最好的名次也就省三等奖.现在作为第一篇算法总结就拿常见的排序算法以我个人的理解,以及代码实现跟大家简单分享一下(排序算法如果一一罗列的话,不下十种.曾在图书馆的旧书架上看过一本近900页的书,内容就是专门介绍排序算法). 选择排序(select) 选择排序比较容

转:各种排序算法的稳定性和时间复杂度小结

选择排序.快速排序.希尔排序.堆排序不是稳定的排序算法, 冒泡排序.插入排序.归并排序和基数排序是稳定的排序算法. 冒泡法:  这是最原始,也是众所周知的最慢的算法了.他的名字的由来因为它的工作看来象是冒泡:  复杂度为O(n*n).当数据为正序,将不会有交换.复杂度为O(0). 直接插入排序:O(n*n) 选择排序:O(n*n) 快速排序:平均时间复杂度log2(n)*n,所有内部排序方法中最高好的,大多数情况下总是最好的. 归并排序:log2(n)*n 堆排序:log2(n)*n 希尔排序:

排序算法的稳定性

首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同.在简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前. 其次,说一下稳定性的好处.排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用.基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的.另外,如果排序算法稳定,对基于比较的排序算法而言,