您的位置:首页 > 其它

CLRS 8.3基数排序

2015-10-29 14:46 337 查看
8.3-1

从左到右分别是原始排序,第一轮、第二轮和最终排序。



8.3-2

稳定:插入排序,归并排序。不稳定:堆排序,快速排序。

通过给每个元素添加一个最初位置属性,当元素值相等时比较初始位置。从而使得排序稳定,需要额外空间 Θ(n)\Theta(n)。

8.3-3

从低到高位排序,现在假设第 tt 位已经排序好,并且是稳定的排序。在第 t+1t+1 位:

1) 第 t+1t+1 位需要排序的数相等,不需要变动第 t+1t+1 位,且第 tt 位是稳定的排序,因此第 t+1t+1 位也是稳定的排序。

2)第 t+1t+1 位需要排序的数不相等,对第 t+1t+1 位进行排序,可知排序后第 t+1t+1 位是稳定的。

综上,可知基数排序是正确的。

8.3-4

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

8.3-5

一共进行 Θ(10d)\Theta(10^d) 次排序。需要记录 Θ(10d)\Theta(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: