使用堆按人口对社区进行排序

Sorting Neighborhoods by Population Using Heap

我正在尝试按人口对社区进行排序。我在 C# 中使用了堆排序算法。我创建了一个数组来保存名为“arr”的社区的人口。并创建了一个数组来保存引擎盖的名称。效果很好,但我怎样才能得到按社区名称排序的输出?

My code is here:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace HoodSorting
{
    public class example
    {
        static void heapSort(int[] arr, int n)
        {
            for (int i = n / 2 - 1; i >= 0; i--)
                heapify(arr, n, i);
            for (int i = n - 1; i >= 0; i--)
            {
                int temp = arr[0];
                arr[0] = arr[i];
                arr[i] = temp;
                heapify(arr, i, 0);
            }
        }
        static void heapify(int[] arr, int n, int i)
        {
            int largest = i;
            int left = 2 * i + 1;
            int right = 2 * i + 2;
            if (left < n && arr[left] > arr[largest])
                largest = left;
            if (right < n && arr[right] > arr[largest])
                largest = right;
            if (largest != i)
            {
                int swap = arr[i];
                arr[i] = arr[largest];
                arr[largest] = swap;
                heapify(arr, n, largest);
            }
        }
        public static void Main()
        {// arr REPRESENTS THE POUPLATION OF THE NEIGHBORHOODS
            string[] neighborhoods = { "Bornova" ,"Westriver","Paradise","Goodman","McMountain","Rocker","Summerlin","Northcity","Greenhill","Sevenwaves"};
            int[] arr = { 55, 25, 89, 34, 12, 19, 78, 95, 1, 100 };
            int n = 10, i;
            Console.WriteLine("Heap Sort");
            Console.Write("Initial array is: ");
            for (i = 0; i < n; i++)
            {
                Console.Write(arr[i] + " ");
            }
            heapSort(arr, 10);
            Console.Write("\nSorted Array is: ");
            for (i = 0; i < n; i++)
            {
                Console.Write(arr[i] + " ");
            }
        }
    }
}

如何获得这样的输出:

Sorted Array is: Greenhill, McMountain,....,........, Northcity, Sevenwaves

非常感谢您的帮助

从 OOP 的角度来看,您可以将两个属性(社区的名称和人口)放在一个对象中。然后,当您对 对象 进行排序时,您仍然会在那里拥有相关数据。

有几种方法可以做到这一点。例如,您可以创建元组。

以下是如何将其应用于您的代码:

    static void heapSort(Tuple<int, string>[] arr)
    {
        int n = arr.Length;
        for (int i = n / 2 - 1; i >= 0; i--)
            heapify(arr, n, i);
        for (int i = n - 1; i >= 0; i--)
        {
            (arr[0], arr[i]) = (arr[i], arr[0]);
            heapify(arr, i, 0);
        }
    }

    static void heapify(Tuple<int, string>[] arr, int n, int i)
    {
        int largest = i;
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        if (left < n && arr[left].Item1 > arr[largest].Item1)
            largest = left;
        if (right < n && arr[right].Item1 > arr[largest].Item1)
            largest = right;
        if (largest != i)
        {
            (arr[i], arr[largest]) = (arr[largest], arr[i]);
            heapify(arr, n, largest);
        }
    }

    public static void Main()
    {
        Tuple<int, string>[] arr = {
            Tuple.Create(55, "Bornova"),
            Tuple.Create(25, "Westriver"),
            Tuple.Create(89, "Paradise"),
            Tuple.Create(34, "Goodman"),
            Tuple.Create(12, "McMountain"),
            Tuple.Create(19, "Rocker"),
            Tuple.Create(78, "Summerlin"),
            Tuple.Create(95, "Northcity"),
            Tuple.Create(1,  "Greenhill"),
            Tuple.Create(100, "Sevenwaves")
        };

        Console.WriteLine("Initial array is: ");
        foreach (var pair in arr)
        {
            Console.Write(pair.Item2 + " ");
        }
        Console.WriteLine();

        heapSort(arr);

        Console.WriteLine("Sorted Array is: ");
        foreach (var pair in arr)
        {
            Console.Write(pair.Item2 + " ");
        }
        Console.WriteLine();
    }