繁体   English   中英

仅使用 while 循环对 C# 进行快速排序

[英]Quick Sort on C# using only while loop

我一直在尝试以一种特定的方式实现快速排序,但我无法在整个 inte.net 上找到它-

  1. 我随机选择一个 pivot(我决定它将成为右侧的最后一项)
  2. i 索引是起始索引
  3. j 索引是 end-2(跳过主元)
  4. 当一个项目在左边较大而另一个项目在右边较小时,我在它们之间交换
  5. 在i遇到j之后,我可以确定从0到i的所有项都小于pivot,从j到数组末尾的所有项都大于pivot
  6. 现在,我想把 pivot 放在正确的位置——它应该在 i 到 j 之间,并返回它的索引

问题是我的算法有错误,我无法弄清楚。 谁能告诉我我做错了什么?

这是我的代码:

public static void swap(int[] a, int i, int j)
{
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
}

public static int partition(int[] a, int start, int end)
{
        int pivot = a[end];
        int i = start;
        int j = end - 1;

        while (i < j)
        {
            while (i < j && a[i] <= pivot)
                i++;
            while (i < j && a[j] > pivot)
                j--;
            swap(a, i, j);
        }

        swap(a, i+1, end);
        return i+1 ;
 }

 public static void QuickSort(int[] a, int start, int end)
 {
        if (start >= end)
            return;
        int p = partition(a, start, end);
        QuickSort(a, start, p - 1);
        QuickSort(a, p + 1, end);
 }

 static void Main(string[] args)
 {
        int[] a = { 9, 1, 4, 7, 3 };
        QuickSort(a, 0, a.Length-1);
        //PrintArr(a);
 }

你的分区方法有问题。

你应该这样。

public static int partition(int[] a, int start, int end)
{
    int pivot = a[end];
    int i = (start - 1);

    for (int j = start; j <= end - 1; j++)
    {
        if (a[j] < pivot)
        {
            i++;
            swap(a, i, j);
        }
    }
    swap(a, i + 1, end);
    return (i + 1);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM