【问题标题】:HeapSort Algorythm from txt file to list of arrays doesn't Sort the numbers从 txt 文件到数组列表的 HeapSort 算法不对数字进行排序
【发布时间】:2017-11-14 13:03:54
【问题描述】:

所以我必须使用给定的伪代码(仅用于堆排序)为大学制作 HeapSort Algorythm。而且我必须使用输入和输出文件。但现在我只制作了工作正常的输入文件,因为它加载了 txt 文件并在控制台中写下了所有数字。所以问题是在向 Main 添加排序方法后没有任何变化。此外,我决定对每种方法进行测试,所有方法都记下我的数字一次,仅此而已。我不太擅长排序,所以我很难找到问题所在。也因为它来自我必须使用的伪代码,并且没有我可以为自己做的代码。那么你知道是什么原因导致排序没有发生吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Win32;
using System.IO;
using System.Windows.Forms;
namespace Zad4
{
    class Program
    {
        void Heapify(List<int> array, int i, int n)
        {
            int largest, temp;
            int parent = i; 
            int left = 2 * i + 1; 
            int right = 2 * i + 2; 

            if (left < n && array[left] > array[parent]) 
            {
                largest = left;
            }
            else
            {
                largest = parent;
            }

            if (right < n && array[right] > array[largest]) 
            {
                largest = right;
            }
            if (largest != i)
            {

                temp = array[i];
                array[i] = array[largest];
                array[largest] = temp;

                Heapify(array, largest, n);
            }

        }

        void BuildHeap(List<int> array, int n)
        {
            int i;
            for (i = (n - 1) / 2; i >= 0; i--) 
            {
                Heapify(array, i, n); 
            }

        }

        void HeapSort(List<int> array, int n)
        {
            int i, temp;
            for (i = n - 1; i >= 0; i--) 
            {
                temp = array[0];
                array[0] = array[n - 1];
                array[n - 1] = temp;

                n = n - 1;

                Heapify(array, 0, n);
                Console.WriteLine(string.Join(" ", array));
            }
        }

        static void Main(string[] args)
        {
            int n = 0;
            Program A = new Program();

            StreamReader myFile =
               new StreamReader("C:\\Users\\dawid\\Desktop\\C#\\Heapsort\\dane.txt");
            string myString = myFile.ReadToEnd();

            myFile.Close();

            char rc = (char)10;
            String[] listLines = myString.Split(rc);
            List<List<int>> listArrays = new List<List<int>>();
            for (int i = 0; i < listLines.Length; i++)
            {
                List<int> array = new List<int>();
                String[] listInts = listLines[i].Split(' ');
                for (int j = 0; j < listInts.Length; j++)
                {
                    if (listInts[j] != "\r")
                    {
                        array.Add(Convert.ToInt32(listInts[j]));
                    }
                }
                listArrays.Add(array);

               A.BuildHeap(array, n);
               A.HeapSort(array, n);
            }

            foreach (List<int> array in listArrays)
            {
                foreach (int i in array)
                {
                    Console.WriteLine(string.Join(" ", array));
                }
            }
            Console.WriteLine();
            Console.ReadLine();
        }
    }
}

【问题讨论】:

  • 使用断点,试着看看你的代码在做什么以及为什么你的排序不起作用,这是我能给你的最好的建议,因为你的代码对我来说太大而我无法阅读现在测试它的方法
  • 我测试了这个程序,稍作改动。我没有从 txt 文件中获取数字,而是使用随机元素创建了一个 int 数组,而不是 A.BuildHeap(array, n); A.HeapSort(array, n);我这样做了: A.BuildHeap(array, array.Length); A.HeapSort(array, array.Length);它确实有效,但是在使用 list (array.Count) 做同样的事情之后它没有用。有什么解决办法吗?
  • 我的意思是:使用断点检查每个变量所持有的值(这称为调试),或者,如果您愿意,可以使用 Console.Write(您想要的变量追踪);在循环内部,它会让您了解代码中发生的事情。
  • 我之前已经试过了,结果是我所有的循环都只写了一次我的 txt 文件,就是这样。但我终于找到了解决办法。

标签: c# file sorting arraylist heapsort


【解决方案1】:

所以我找到的解决方案只是改变了我阅读 txt 文件的方式,最重要的是我的方法使用不当。所以这就是它现在的样子,而且它分类得很好。也许我不应该问一个问题,因为我自己得到了答案。不过还好。你去吧:

 static void Main(string[] args)
    {

        Program A = new Program();
        string[] array = System.IO.File.ReadAllLines(@"C:\Users\dawid\Desktop\C#\Heapsort\dane.txt");
        int[] arrayInt = Array.ConvertAll(array, int.Parse);
        A.BuildHeap(arrayInt, arrayInt.Length);
        A.HeapSort(arrayInt, arrayInt.Length);
        Console.WriteLine(string.Join(" ", arrayInt));
        Console.ReadLine();
    }

【讨论】:

    猜你喜欢
    • 2022-06-15
    • 2012-05-23
    • 2019-11-19
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多