题目描述
如题,只求出其在原数组的序列号即可。
示例:
输入:int[] a = {1,2,3,4,5,6,7,8,9}, 3
输出:{8,7,6}
表示:在a数组中,找前3个最大数的序列。
最大的是a[8] 第2大的是a[7],第3大的是a[6]。
代码
int[] Search_N_MaxInArray(int[] arr, int N)
{
//是否被取出的标志,取出则为true
bool[] flag = new bool[arr.Length];
//初始化为false,都没被选取
for (int i = 0; i < flag.Length; i++)
{
flag[i] = false;
}
//保存最大的n个数
int[] NMax = new int[N];
//开始查找
for (int i = 0; i < N; i++)
{
//初始化NMax[i]为首个没被使用的数
for (int x = 0; x < flag.Length; x++)
{
if (!flag[x])
{
NMax[i] = x;
break;
}
}
//开始在arr查找
for (int j = 0; j < arr.Length; j++)
{
//如果没有被选取,才进行比较
if (!flag[j])
{
//如果找到更大的数。取出
if (arr[NMax[i]] < arr[j])
{
NMax[i] = j;
}
}
//循环一次结束,将找到的数给标记上,防止2次使用
if (j == arr.Length-1)
{
flag[NMax[i]] = true;
}
}
}
return NMax;
}
输入数组长度为m,要查找n个数。
时间复杂度:
o(m + n * (range(1, n)+ n * M)
->o((n +1) * m + range(n, n^2))
当n接近于0时,复杂度为平方。
n值较小且n远小于m 时,复杂度为线性的。
核心的排序仍是冒泡算法。
空间复杂度:
O(m+ n)。