【问题标题】:Sorting Neighborhoods by Population Using Heap使用堆按人口对邻域进行排序
【发布时间】:2022-01-10 16:59:06
【问题描述】:

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

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

非常感谢您的帮助

【问题讨论】:

    标签: c# sorting data-structures heap


    【解决方案1】:

    从 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();
        }
    

    【讨论】:

    • 我也会对你的代码进行一些重构,左右排序可以从 heapify 方法中取出,并且更具可读性,而且名称“i”和“n”真的不是那么好名字,一定有更好的东西。也不是“最大”,我的意思是内部方法是的,上下文很清楚,但是,当您在 6 个月后回来时,它仍然易于阅读吗?不见得。记住:代码是给人类的,计算机只能理解 1/0
    • 非常感谢您的回复。我是二年级计算机科学专业的学生,​​我一定会考虑您的建议以提高我的代码质量。我有两个关于代码和职业的问题:如何打印前 3 名人口社区?其次,我想在业务分析师或产品管理方面建立我的 IT 职业生涯。我喜欢编码,但我的爱不足以追求职业。我的沟通技巧很高,我喜欢与人交流。你会建议我提前做什么,以便我可以在我提到的两个领域取得进步?
    • 第一个问题:排序后,可以访问数组开头的前三个。如果您有兴趣获得前三名而不是排序列表,那么您不需要 HeapSort。您应该只创建堆并从堆中弹出前三个元素。
    • 谢谢我刚刚完成了。
    猜你喜欢
    • 2021-11-02
    • 2011-12-08
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    相关资源
    最近更新 更多