📜  排序算法-基数排序

📅  最后修改于: 2020-10-15 03:11:52             🧑  作者: Mango

基数排序

基数排序处理元素的方式与根据学生姓名的字母顺序对其排序的方式相同。在这种情况下,由于英语中有26个字母,因此有26个基数。在第一遍中,根据名称的第一个字母的升序对名称进行分组。

在第二遍中,根据第二个字母的升序对名称进行分组。继续相同的过程,直到找到名称的排序列表。存储桶用于存储每次通过时产生的名称。通过次数取决于带有最大字母的姓名的长度。

对于整数,基数排序会根据数字对数字进行排序。在从LSB到MSB的数字位数之间进行比较。通过的次数取决于位数最多的号码的长度。

复杂

Complexity Best Case Average Case Worst Case
Time Complexity Ω(n+k) θ(nk) O(nk)
Space Complexity O(n+k)

考虑下面给出的长度为6的数组。使用Radix排序对数组进行排序。

A = {10,2,901,803,1024}

传递1 :(按0位置的数字排序列表)

10、901、2、803、1024。

阶段2 :(按10位数字对列表进行排序)

02、10、901、803、1024

第三遍:(按100位数字对列表进行排序)

02、10、1024、803、901。

第4遍:(按1000位数字对列表进行排序)

02、10、803、901、1024

算法

  • 步骤1 :在ARR中找到最大的数字
  • 第2步:[INITIALIZE] SET NOP =大位数
  • 步骤3 :SET PASS = 0
  • 步骤4 :在PASS <= NOP-1时重复步骤5
  • 步骤5 :SET I = 0并初始化值区
  • 步骤6 :在我重覆步骤7至9
  • 步骤7 :在A [I]的PASSth位置设置DIGIT =位数
  • 步骤8 :将A [I]添加到编号为DIGIT的存储桶中
  • 第9步:编号为DIGIT的存储桶的增量存储桶计数[LOOP结束]
  • 第10步:在存储桶中收集数字[结束循环]
  • 步骤11 :结束

C程序

#include 
int largest(int a[]);
void radix_sort(int a[]);
void main()
{
    int i;
    int a[10]={90,23,101,45,65,23,67,89,34,23};     
    radix_sort(a);    
    printf("\n The sorted array is: \n");
    for(i=0;i<10;i++)
        printf(" %d\t", a[i]);
}

int largest(int a[])
{    
    int larger=a[0], i;    
    for(i=1;i<10;i++)
    {
        if(a[i]>larger)
        larger = a[i];
    }
    return larger;
}
void radix_sort(int a[])
{
    int bucket[10][10], bucket_count[10];
    int i, j, k, remainder, NOP=0, divisor=1, larger, pass;
    larger = largest(a);
    while(larger>0)
    {
        NOP++;
        larger/=10;
    }
    for(pass=0;pass

输出:

The sorted array is:
23
23
23
34
45
65
67
89
90
101

Java程序

public class Radix_Sort {
public static void main(String[] args) {
        int i;
        Scanner sc = new Scanner(System.in);
        int[] a = {90,23,101,45,65,23,67,89,34,23};
        radix_sort(a);    
        System.out.println("\n The sorted array is: \n");
        for(i=0;i<10;i++)
            System.out.println(a[i]);
    }

    static int largest(inta[])
    {    
        int larger=a[0], i;    
        for(i=1;i<10;i++)
        {
            if(a[i]>larger)
            larger = a[i];
        }
        returnlarger;
    }
    static void radix_sort(inta[])
    {
        int bucket[][]=newint[10][10];
        int bucket_count[]=newint[10];
        int i, j, k, remainder, NOP=0, divisor=1, larger, pass;
        larger = largest(a);
        while(larger>0)
        {
            NOP++;
            larger/=10;
        }
        for(pass=0;pass

输出:

The sorted array is:
23
23
23
34
45
65
67
89
90
101

C#程序

using System;
public class Radix_Sort {
public static void Main() 
{
        int i;
        int[] a = {90,23,101,45,65,23,67,89,34,23};
        radix_sort(a);    
        Console.WriteLine("\n The sorted array is: \n");
        for(i=0;i<10;i++)
            Console.WriteLine(a[i]);
    }

    static int largest(int[] a)
    {    
        int larger=a[0], i;    
        for(i=1;i<10;i++)
        {
            if(a[i]>larger)
            larger = a[i];
        }
        return larger;
    }
    static void radix_sort(int[] a)
    {
        int[,] bucket=new int[10,10];
        int[] bucket_count=new int[10];
        int i, j, k, remainder, NOP=0, divisor=1, larger, pass;
        larger = largest(a);
        while(larger>0)
        {
            NOP++;
            larger/=10;
        }
        for(pass=0;pass

输出:

The sorted array is:
23
23
23
34
45
65
67
89
90
101