算法导论8.3-4 O(n)时间内对[0..n^-1]之间的n个数排序

本文探讨了如何在O(n)的时间复杂度内,有效地对0到n^2-1范围内的n个整数进行排序。通过阐述详细思路,结合具体的代码实现,展示了快速排序的高效性能。
摘要由CSDN通过智能技术生成

一、题目

如何在O(n)时间内,对0到n^2-1之间的n个整数进行排序

 

二、思路

把整数转换为n进制再排序,每个数有两位,每位的取值范围是[0..n-1],再进行基数排序

 

三、代码

#include <iostream>
#include <cmath>
using namespace std;

int n, radix, length_A, digit = 2;
void Print(int *A, int start, int end)
{
	int i;
	for(i = start; i <= end; i++)
	{
		if(i == start)cout<<'{';
		else cout<<' ';
		cout<<A[i];
	}
	cout<<'}'<<endl;
}
//基数排序调用的稳定排序
void Stable_Sort(int *A, int *B, int k, int d)
{
	int i, j;
	//将C数组初始化为0,用于计数
	int *C = new int[k+1];
	for(i = 0; i <= k; i++)
		C[i] = 0;
	int *D = new int[length_A+1];
	for(j = 1; j <= length_A; j++)
	{
		//D[j]表示第[j]个元素的第i位数字
		D[j] = A[j] % (int)pow(radix*1.0, d) / (int)pow(radix*1.0, d-1);
		//C[j]表示数字D[j]在数组A中出现的次数
		C[D[j]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值