【问题标题】:How to make Quick Sort sort decimal numbers C#如何使快速排序对十进制数进行排序C#
【发布时间】:2016-04-20 15:24:50
【问题描述】:

这是一个快速排序程序,它从文件中读取数字,然后将它们从小到大排序。我需要它能够做到完全相同,但对于带小数的数字。我知道有一些方法可以将 int 转换为 double、decimal 或 float,但我已经尽我所能,但没有任何工作,有人可以告诉我他们将如何更改此代码以使其工作。以下是我尝试的方法:

class quickSort
{

private double[] array = new double[1010];
private int len;

public void QuickSort()
{
    sort(0, len - 1);
}

public void sort(double left, double right)
{
    double pivot;
    double leftend, rightend;

    leftend = left;
    rightend = right;
    pivot = array[left];

    while (left < right)
    {
        while ((array[right] >= pivot) && (left < right))
        {
            right--;
        }

        if (left != right)
        {
            array[left] = array[right];
            left++;
        }

        while ((array[left] <= pivot) && (left < right))
        {
            left++;
        }

        if (left != right)
        {
            array[right] = array[left];
            right--;
        }
    }

    array[left] = pivot;
    pivot = left;
    left = leftend;
    right = rightend;

    if (left < pivot)
    {
        sort(left, pivot - 1);
    }

    if (right > pivot)
    {
        sort(pivot + 1, right);
    }
}

public static void Main()
{
    quickSort q_Sort = new quickSort();

    string[] years = System.IO.File.ReadAllLines(@"C:\WS1_Rain.txt");
    var yearArray = years.Select(item => Convert.ToDouble(item));
    double[] array = yearArray.ToArray();

    q_Sort.array = array;
    q_Sort.len = q_Sort.array.Length;
    q_Sort.QuickSort();

    for (int j = 0; j < q_Sort.len; j++)
    {
        Console.WriteLine(q_Sort.array[j]);
    }
    Console.ReadKey();
}
  }
}

【问题讨论】:

  • 好吧,您可以先将大部分ints 更改为double
  • 如何将数字转换为小数?在您的示例中,您将一个 int 解析为一个 IEnumerable 的 ints ...您应该尝试双打
  • 向我们展示导致问题的代码。
  • 您甚至不能使用可复制粘贴的代码来做到这一点? stackoverflow.com/questions/36733106/…

标签: c# sorting


【解决方案1】:

如果您的最终目标是纯粹对数组进行排序,则可以使用 Linq!

string[] years = System.IO.File.ReadAllLines(@"C:\WS1_Rain.txt");
            var yearArray = years.Select(item => Convert.ToDouble(item));
            double[] array = yearArray.ToArray();

            var sorted = array.OrderBy(a => a);

但是,如果您希望修改 QuickSort 类,您可以这样做,只需对原始代码进行最少的更改。只有数组需要支持双精度。您用于管理索引的支持变量可以保持为整数:

class quickSort
    {
        private double[] array = new double[1010];

        private int len;

        public void QuickSort()
        {
            sort(0, len - 1);
        }

        public void sort(int left, int right)
        {
            double pivot;
            int leftend, rightend;

            leftend = (int)left;
            rightend = (int)right;
            pivot = array[left];

            while (left < right)
            {
                while ((array[right] >= pivot) && (left < right))
                {
                    right--;
                }

                if (left != right)
                {
                    array[left] = array[right];
                    left++;
                }

                while ((array[left] <= pivot) && (left < right))
                {
                    left++;
                }

                if (left != right)
                {
                    array[right] = array[left];
                    right--;
                }
            }

            array[left] = pivot;
            pivot = left;
            left = leftend;
            right = rightend;

            if (left < pivot)
            {
                sort(left, Convert.ToInt32(pivot - 1));
            }

            if (right > pivot)
            {
                sort(Convert.ToInt32(pivot + 1), right);
            }
        }

        static void Main(string[] args)
        {
            quickSort q_Sort = new quickSort();

            string[] years = System.IO.File.ReadAllLines(@"C:\WS1_Rain.txt");
            var yearArray = years.Select(item => Convert.ToDouble(item));
            double[] array = yearArray.ToArray();

            var sorted = array.OrderBy(a => a);

            q_Sort.array = array;
            q_Sort.len = q_Sort.array.Length;
            q_Sort.QuickSort();

            for (int j = 0; j < q_Sort.len; j++)
            {
                Console.WriteLine(q_Sort.array[j]);
            }

            Console.ReadKey();
        }
    }

【讨论】:

  • 谢谢!你这么轻松就帮了我很多!
  • 我假设您的意思是完整的排序功能?关于我最初的快速回答,你可以做 var sorted = array.OrderByDescending(a => a);
  • 使用 LINQ !不要硬核! var sorted = array.OrderByDescending(a =&gt; a);
  • @Stamos tbh 这似乎是一项家庭作业。使用 LINQ 是一种捷径,学生不会学习任何有关数据操作、数组、类型等的知识。他们也不会学习如何设计中等复杂度(就经验水平而言)的程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
相关资源
最近更新 更多