在排序前获取具有重复值的数组元素的索引

本文关键字:数组元素 索引 排序 获取 | 更新日期: 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]} ");
        }
    }   
}