在排序前获取具有重复值的数组元素的索引
本文关键字:数组元素 索引 排序 获取 | 更新日期: 2023-09-27 18:16:12
我有一个具有重复值的整数数组。我需要按降序排序并打印2行。
Algorythm:
- index = 0;
- 查找数组 中的最大值
- 通过
Console.Write($"{maxPos} ");
打印其原始索引 - 与第一个值为
index
的元素交换 - 对数组 中的所有其他元素重复此操作
- 使用
Console.Write($"{a[i]} ");)
打印排序数组
问题是无论如何我都不能在控制台中打印索引。
using System;
public class SortProblem
{
public static void Main()
{
Sort();
}
public static void Sort()
{
var array = new []
{
10, 10, 5, 2, 2, 5, 6, 7, 8, 15, 4, 4, 4, 2, 3, 5, 5, 36, 32, 623, 7, 475, 7, 2, 2, 44, 5, 6, 7, 71, 2
};
for (int index = 0; index < array.Length -1; index++)
{
int max = index;
for (int elemIndex = index+1; elemIndex < array.Length; elemIndex++)
{
if (array[elemIndex] > array[max])
{
max = elemIndex;
}
}
int tmp = array[index];
array[index] = array[max];
array[max] = tmp;
}
foreach (int element in array)
{
Console.Write (element+" ");
}
}
}
期望输出:
19 21 29 25 17 18 9 19 21 21 19 19 20 22 28 21 27 16 18 26 27 29 22 27 29 27 25 26 27 28 29 30623 475 71 44 36 32 15 10 10 8 7 7 7 7 6 6 5 5 5 5 5 44 32 2 2 2 2 2 2 2
最简单的解决方案:
using System;
using System.Linq;
public class SortProblem
{
public static void Main()
{
var result = new[]
{
10, 10, 5, 2, 2, 5, 6, 7, 8, 15, 4, 4, 4, 2, 3, 5, 5, 36, 32, 623, 7, 475, 7, 2, 2, 44, 5, 6, 7, 71, 2
}.Select((element, idx) => new { Value = element, OriginalIndex = idx }).OrderByDescending(item => item.Value).ToList(); // The last one only needed to persist the result set and avoid double processing
Console.WriteLine(string.Join(" ", result.Select(item => item.OriginalIndex)));
Console.WriteLine(string.Join(" ", result.Select(item => item.Value)));
}
}
但是要回到你的算法:
using System;
using System.Text;
public class SortProblem
{
public static void Main()
{
Sort();
}
private static void Sort()
{
StringBuilder sb = new StringBuilder();
var array = new[]
{
10, 10, 5, 2, 2, 5, 6, 7, 8, 15, 4, 4, 4, 2, 3, 5, 5, 36, 32, 623, 7, 475, 7, 2, 2, 44, 5, 6, 7, 71, 2
};
for (int i = 0; i < array.Length; ++i)
{
int max = i;
for (int j = i + 1; j < array.Length; ++j)
if (array[max] < array[j])
max = j;
sb.Append(max);
sb.Append(" ");
int temp = array[i];
array[i] = array[max];
array[max] = temp;
}
Console.WriteLine(sb.Remove(sb.Length - 1, 1).ToString());
Console.WriteLine(string.Join(" ", array));
}
}
using System;
public class SortProblem
{
public static void Main()
{
Sort();
Console.ReadKey();
}
public static void Sort()
{
var a = new[]
{
10, 10, 5, 2, 2, 5, 6, 7, 8, 15, 4, 4, 4, 2, 3, 5, 5, 36, 32, 623, 7, 475, 7, 2, 2, 44, 5, 6, 7, 71, 2
};
Max_elements(a);
Console.WriteLine();
Sort_elements(a);
}
private static void Max_elements(int[] a)
{
/*"індекс" = 0 */
for (int index = 0; index < a.Length; index++)
{
/*Знаходить у списку найбільше значення таке,
*що його позиція дорівнює або більша за "index"
*(справа від елемента на позиції "індекс")*/
int maxPos = index, tmp;
/* відсортує заданий масив "a"
* у порядку спадання "elemIndex < a"
* за допомогою алгоритму сортування вибором ".Length"*/
for (int elemIndex = index + 1; elemIndex < a.Length; elemIndex++)
{
/*Якщо елемент на позиції elemIndex
*більше елемента на позиції maxPos,
*то необхідно онвити значення "індекс"*/
if (a[elemIndex] > a[maxPos])
{
maxPos = elemIndex;
}
}
/*Міняє його місцями з елементом масиву на позиції "індекс"*/
tmp = a[index];
a[index] = a[maxPos];
a[maxPos] = tmp;
/*виводимо всі позиції максимального елемента і пробіл після неї*/
Console.Write($"{maxPos} ");
/*Рядок, який передує символ $ називається Інтерпольований рядок.
Інтерпольовані рядки можуть містити вирази взяті у фігурні дужки {}*/
}
}
private static void Sort_elements(int[] a)
{
for (int i = 0; i < a.Length; i++)
{
/*виводимо всі елементи відсортованого масиву і пробіл після неї*/
Console.Write($"{a[i]} ");
}
}
}