降序快速排序 c#(无内置排序函数)
Quicksort in descending order c# (No built in sort functions)
所以我实现了一个快速排序算法:
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 的建议,它现在可以正常工作了。
只需更改:
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--;
如果你想要一个更通用的解决方案,可以应用于任何实现 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;
}
所以我实现了一个快速排序算法:
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 的建议,它现在可以正常工作了。
只需更改:
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--;
如果你想要一个更通用的解决方案,可以应用于任何实现 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;
}