计数排序和基数排序

基本思想:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置了。


//计数排序
#ifndef COUNTINGSORT_H_
#define COUNTINGSORT_H_

void CountingSort(int *A,int n, int *B, int k)              //A为输入数组,n为A的长度,B为输出数组,A中每一个元素都在区间[0,k]中
{
	int *count = new int[k + 1];                      //count[i]为元素i出现的次数

	for (int i = 0; i <= k; i++)
		count[i] = 0;                                 //初始化

	for (int j = 0; j < n; j++)
		count[A[j]] = count[A[j]] + 1;                                //统计A[j]出现次数

	for (int i = 1; i <= k; i++)
		count[i] = count[i] + count[i - 1];           //count[i]为数组A中小于i的个数

	for (int j = n - 1; j >= 0; j--)
	{
		B[count[A[j]]-1] = A[j];                        //A中比A[j]小的个数就是在B数组中的下标
		/*上面要-1的原因是:因为计数结果不可能出现0,从1开始的,为了和下标对应,就必须减1*/
		count[A[j]]--;                                //如果有相同数据,下一个数据排在上一个相同数据的前面
	}

}


#endif


#ifndef RADIXSORT_H_
#define RADIXSORT_H_


#include <string.h>


/*
功能:去除number中第(indexN+1)位数字返回
*/
int GetDigit(int number, int indexN)
{
	for (int i = indexN; i > 0; i--)
		number = number / 10;
	return number % 10;
}


/*
功能:对数组各个元素依据某一位进行排序
A:待排序数组
n:数组元素个数
indexN:排序依据的位数
k:基数为10,则k值为9
*/
void DigitSort(int *A, int n, int indexN, int k = 9)
{
	int *count = new int[k + 1];             //count[i]为元素i出现的次数
	memset(count, 0, sizeof(int)*(k+1));     //初始化为0

	int *B = new int[n];                     //存原数组按该位排序后的结果
	memset(B, 0, sizeof(int)*n);             //初始化为0

	int *digit = new int[n];                 //存原数组各元素该为数字
	memset(digit, 0, sizeof(int)*n);         //初始化为0

	for (int i = 0; i < n; i++)
		digit[i] = GetDigit(A[i], indexN);   //注:此处是indexN

	for (int j = 0; j < n; j++)
		count[digit[j]] = count[digit[j]] + 1;                                //统计digit[j]出现次数

	for (int i = 1; i <= k; i++)
		count[i] = count[i] + count[i - 1];           //count[i]为数组A中小于i的个数

	for (int j = n - 1; j >= 0; j--)
	{
		B[count[digit[j]] - 1] = A[j];                        
		/*上面要-1的原因是:因为计数结果不可能出现0,从1开始的,为了和下标对应,就必须减1*/
		count[digit[j]]--;                                //如果有相同数据,下一个数据排在上一个相同数据的前面
	}

	memcpy(A, B, sizeof(int)*n);                      //把排序结果写回原数组               

	delete[] B;                                      
	delete[] count;
	delete[] digit;
}

/*
功能:基数排序
A:待排序数组
n:数组元素个数
indexN:排序依据的位数减1
注意:调用时indexN一定要将位数减1
*/

void RadixSort(int *A, int n, int indexN)
{
	for (int i = 0; i <= indexN; i++)            //先排地位,再排高位
		DigitSort(A, n, i);
}


#endif



测试部分:

#include <iostream>
#include "CountingSort.h"
#include "RadixSort.h"

using namespace std;

int main()
{
	int a[] = { 1, 2, 5, 6, 43, 5, 9, 25, 3 ,7};
	//int b[10] = {0};
	//CountingSort(a, 10, b, 43);
	RadixSort(a, 10, 1);
	for (int i = 0; i < 10; i++)
		cout << a[i] << endl;
	
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值