CLRS 8.3基数排序

8.3-1
从左到右分别是原始排序,第一轮、第二轮和最终排序。
这里写图片描述

8.3-2
稳定:插入排序,归并排序。不稳定:堆排序,快速排序。
通过给每个元素添加一个最初位置属性,当元素值相等时比较初始位置。从而使得排序稳定,需要额外空间 Θ(n)

8.3-3
从低到高位排序,现在假设第 t 位已经排序好,并且是稳定的排序。在第 t+1 位:
1) 第 t+1 位需要排序的数相等,不需要变动第 t+1 位,且第 t 位是稳定的排序,因此第 t+1 位也是稳定的排序。
2)第 t+1 位需要排序的数不相等,对第 t+1 位进行排序,可知排序后第 t+1 位是稳定的。
综上,可知基数排序是正确的。

8.3-4
使用基数排序,将每个数转换为 n 进制,则每个数占 3 位。这样就有 Θ(3(n+n))=Θ(6n)=Θ(n)

8.3-5
一共进行 Θ(10d) 次排序。需要记录 Θ(10d) 堆卡片。

附上10进制数的基数排序(只能排序自然数)

#include <iostream>
using std::cout;
using std::endl;

//辅助函数,求n个数据的最大数的位数
int maxBit(int *data,int begin,int end)
{
    int res = 1, radix = 10;
    for(int i = begin; i < end; i++)
    {
        while(data[i] >= radix){
            ++res;
            radix *= 10;
        }
    }
    return res;
}

/***基数排序,不能含有负数*******************
****排序数组的begin到end位置的数(不含end)**
*****************************************/
void radixsort(int data[], int begin,int end)
{
    int d = maxBit(data,begin,end);
    int *tmp = new int[end-begin];
    int *count = new int[10];//计数器
    int radix = 1;
    for(int i = 0; i < d; i++)//进行d次排序
    {
        memset(count,0,sizeof(int)*10);//每次分配前清空计数器
        for(int j = begin; j < end; j++)
        {
            int k = (data[j] / radix) % 10;
            count[k]++;//统计每个桶中的记录数
        }
        for(int j = 1; j < 10; j++)
            count[j] += count[j-1];
        for(int j = end - 1; j >= begin; j--)
        {
            int k = (data[j] / radix) % 10;
            tmp[count[k]-1] = data[j];
            --count[k];
        }
        for(int j = begin; j < end; j++)//将临时数组的内容复制到data中
            data[j] = tmp[j-begin];
        radix *= 10;
    }
    delete []tmp;
    delete []count;
}

int main()
{
    int ia[] = {329,457,657,839,436,720,355};
    radixsort(ia,2,7);
    for(int i = 0; i < 7; i++)
        cout << ia[i] << ' ';
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值