根据数组中数字出现频率排序

不知道是那个面试题目,题目大概意思就是数组中不多于10个一位的数字(0--9),根据数字出现的频率从大到小排序,频率相同的按照数值大小排序,最后输出排序后的结果。

例如数组数据:arrayA[10]={1,1,2,3,4,4,6,7,7,7}; 根据频率排序后结果是:7 7 7 4 4 1 1 2 3 6; 再根据频率相同时按照数值大小排序,最后结果是: 7 7 7 4 4 1 1 6 3 2.

分析:

将数字的频率存进一个数组arrayB中,数组arrayB的下标是数组arrayA的数据,数组arrayB下标对应的值就是arrayA中对应数据的频率:

arrayB[ 10 ] = { 0 2 1 1 2 0 1 3 0 0 };

对应下标:       0 1 2 3 4 5 6 7 8 9

同时将数组arrayB数据复制一份到数组arrayC中,作为保存以便后面对比。

arrayC[ 10 ] ={0 2 1 1 2 0 1 3 0 0 };

使用插入法排序可以使相同频率的数字保持相对大小的顺序不变。对数组arrayB数据(arrayA数据频率)进行排序结果是:0 0 0 01 1 1 2 2 3.

最后从数组arrayB中依次从后往前(即频率从高到低输出)取数,arrayC也依次从后往前取数(保证频率相同时数值大的先打印),两数比较,若相等则打印:数组arrayC的下标是数组arrayA中的数值,值是出现的频率,打印频率那么多个数值即可。打印完一个将该数组数值标记,避免重复打印。

代码:

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <ctime>

void SortNum(int arrayA[], int length)
{
	int arrayB[10]={0};
	int arrayC[10]={0};//作为辅助的临时数组
	int i,j,k;
	for (i=0; i<length; i++)//数组B中保存的是数组A数字的出现频率
	{
		arrayB[arrayA[i]]++;
	}

	for (i=0; i<=9; i++)//将数组B中还未排序前的数据保存到数组C中,以便对照
	{
		arrayC[i]=arrayB[i];
	}

	int key;
	for (i=1; i<=9; i++)//插入排序
	{
		key=arrayB[i];
		j=i-1;
		while (j>=0 && key<arrayB[j]) 
		{
			arrayB[j+1]=arrayB[j];
			j--;
		}
		arrayB[j+1]=key;
	}

	for (j=9; j>0 && arrayB[j]>0; j--)
	{
		key=arrayB[j];
		for (i=9; i>0; i--)
		{
			if (key==arrayC[i])
			{
				for (k=0; k<arrayC[i]; k++)
				{
					cout<<i<<"  ";//或者将要打印的数据存进数组中返回
				}
				arrayC[i]=-1;//表示已经打印过了,避免重复打印
			}
		}
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	int length=10;
	int arrayA[10]={1,1,2,3,4,4,6,7,7,7};
	cout<<"排序前元素序列:"<<endl;
	for (int i=0; i<10; i++)
	{
		cout<<arrayA[i]<<"  ";
	}
	cout<<endl;
	cout<<"排序后元素序列:"<<endl;
	SortNum(arrayA,length);
	getchar();
	return 0;
}

结果:




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值