• 基数排序


    基数排序:最稳定的排序。 第二个基于非比较的排序。第一个是计数排序

    LSD:低位优先

    MSD : 高位优先

    接下来说的是LSD低位优先

    思路:按位建立哈希表,从低位开始

    由于每一位都有0~9的阿拉伯数字构成。所以我们可以申请固定的空间

    根据个位建立哈希表,再按照顺序放回原数组

    根据十位建立哈希表,再按照顺序放回原数组

    根据百位建立哈希表,再按照顺序放回原数组

    。。。。

    需要注意的是,哈希表的添加为尾添加,且必须按照原数组顺序。

    代码:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 typedef struct node1
     5 {
     6     int num;
     7     struct node1* pnext;
     8 }Node;
     9 
    10 void RadixSort(int* arr,int len)
    11 {
    12     //找到最高位,决定我们要建立几次哈希表
    13     int Max = arr[0];
    14     for(int i = 0; i < len;i++)
    15     {
    16         if(Max < arr[i])
    17             Max = arr[i];
    18     }
    19 
    20     int n = 10;
    21     while(Max/n)
    22     {
    23         n *=10;
    24     }
    25     Node** Radix = (Node**)malloc(sizeof(Node*)*10);
    26     memset(Radix,0,sizeof(Node*)*10);
    27     for(int i = 1; i < n;i*=10)
    28     {
    29         //建立哈希表
    30         for(int j = 0; j < len;j++)
    31         {
    32             Node* node = (Node*)malloc(sizeof(Node));
    33             node->num = arr[j];
    34             node->pnext = NULL;
    35             int index = arr[j]/i%10;//求得每一位上的数
    36             //建立哈希表进行尾添加
    37             if(Radix[index])
    38              {
    39                 Node* tmp = Radix[index];
    40                 while(tmp->pnext != NULL)
    41                 {
    42                     tmp = tmp->pnext;
    43                 }
    44                 tmp->pnext = node;
    45              }
    46              else
    47                 Radix[index] = node;
    48         }
    49         int id = 0;
    50         Node* pDel;
    51         //放回原数组并删除原链表的节点
    52         for(int i = 0; i < 10;i++)
    53         {
    54             while(Radix[i])
    55             {
    56                 arr[id++] = Radix[i]->num;
    57                 pDel = Radix[i];
    58                 Radix[i] = Radix[i]->pnext;
    59                 free(pDel);
    60                 pDel = NULL;
    61             }
    62         }
    63     }
    64     free(Radix);
    65     Radix = NULL;
    66 }
    67 int main()
    68 {
    69     int arr[] = {322,15,45,3,78,987,54,0,5,14};
    70     int len = sizeof(arr)/sizeof(arr[0]);
    71 
    72     RadixSort(arr,len);
    73     for(int i = 0; i < len;i++)
    74         printf("%d ",arr[i]);
    75 }
  • 相关阅读:
    MD文件利用标题等级进行分割代码实现
    IDEA插件-Git Commit Template
    IDEA插件-Translation
    IDEA使用-Debug回到上一步
    Java语法糖详解
    MySQL 事务的隔离级别初窥
    Java异常体系概述
    ssh-copy-id三步实现SSH免密登录
    深入理解ThreadLocal
    使用Guava RateLimiter限流入门到深入
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/9144499.html
Copyright © 2020-2023  润新知