【问题标题】:Quicksort in descending order c# (No built in sort functions)降序快速排序c#(无内置排序函数)
【发布时间】:2021-11-06 21:01:14
【问题描述】:

所以我实现了一个快速排序算法:

 public static void Quick_Sort(int[] data, int left, int right,int dataSet)
{
    int i = left, j = right;
    int pivot, temp;
    dataSet tempSet;
    pivot = data[(left + right) / 2];
    do
    {
        while ((data[i] < pivot) && (i < right)) i++;
        while ((pivot < data[j]) && (j > left)) j--;
        if (i <= j)
        {
            //First change the data Array
            temp = data[i];
            data[i] = data[j];
            data[j] = temp;
            //Then change the dataSet array
            if (dataSet == 1)
            {
                tempSet = Program.set1Data[i];
                Program.set1Data[i] = Program.set1Data[j];
                Program.set1Data[j] = tempSet;
            }
            else if (dataSet == 2)
            {
                tempSet = Program.set2Data[i];
                Program.set2Data[i] = Program.set2Data[j];
                Program.set2Data[j] = tempSet;
            }
            else if (dataSet ==3)
            {
                tempSet = Program.bothSetData[i];
                Program.bothSetData[i] = Program.bothSetData[j];
                Program.bothSetData[j] = tempSet;
            }

            i++;
            j--;
        }
    } while (i <= j);
    if (left < j) Quick_Sort(data, left, j,dataSet);
    if (i < right) Quick_Sort(data, i, right,dataSet);
}

我想知道如何按降序对其进行快速排序。现在,我实际上需要对数组进行排序,我不能只使用Array.Reverse() 之类的东西来获得我想要的结果。非常感谢。


编辑 我已将其更改为: while ((data[i] > pivot) && (i > right)) i++; while ((pivot > data[j]) && (j < left)) j--;

按照 Mhd 的建议,它现在可以正常工作了。

【问题讨论】:

标签: c# quicksort


【解决方案1】:

只是改变:

while ((data[i] < pivot) && (i < right)) i++;
while ((pivot < data[j]) && (j > left)) j--;

到:

while ((data[i] > pivot) && (i < right)) i++;
while ((pivot > data[j]) && (j > left)) j--;

【讨论】:

  • 刚刚尝试过,但似乎没有用。还是一片混乱。我是否也需要在其他条件下反转其他比较?
【解决方案2】:

如果您想要一个更通用的解决方案,可以应用于实现Ilist 接口的任何东西,这可能是一种方法,那么您只需传入false 标志以进行降序:

public static void QuickSort(IList list, int start, int end, bool asc = true)
{
    if (start >= end)
    {
        return;
    }

    int i = Partition(list, start, end, asc);

    QuickSort(list, start, i - 1, asc);
    QuickSort(list, i + 1, end, asc);
}

private static int Partition(IList list, int start, int end, bool asc)
{
    object temp;
    object p = list[end];
    int i = start - 1;

    for (int j = start; j <= end - 1; j++)
    {
        if (asc)
        {
            if (((IComparable)list[j]).CompareTo(p) <= 0)
            {
                i++;
                temp = list[i];
                list[i] = list[j];
                list[j] = temp;
            }
        }
        else
        {
            if (((IComparable)list[j]).CompareTo(p) >= 0)
            {
                i++;
                temp = list[j];
                list[j] = list[i];
                list[i] = temp;
            }
        }

    }


    temp = list[i + 1];
    list[i + 1] = list[end];
    list[end] = temp;
    return i + 1;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 2012-11-21
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    相关资源
    最近更新 更多