8.3-1
从左到右分别是原始排序,第一轮、第二轮和最终排序。
8.3-2
稳定:插入排序,归并排序。不稳定:堆排序,快速排序。
通过给每个元素添加一个最初位置属性,当元素值相等时比较初始位置。从而使得排序稳定,需要额外空间
Θ(n)
。
8.3-3
从低到高位排序,现在假设第
t
位已经排序好,并且是稳定的排序。在第
1) 第
t+1
位需要排序的数相等,不需要变动第
t+1
位,且第
t
位是稳定的排序,因此第
2)第
t+1
位需要排序的数不相等,对第
t+1
位进行排序,可知排序后第
t+1
位是稳定的。
综上,可知基数排序是正确的。
8.3-4
使用基数排序,将每个数转换为
n
进制,则每个数占 3 位。这样就有
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;
}