1. 程式人生 > >根據陣列中數字出現頻率排序

根據陣列中數字出現頻率排序

不知道是那個面試題目,題目大概意思就是陣列中不多於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;
}

結果: