我必须在c程序中找到用于BEST CASE INPUT的快速排序的时间复杂度,并且我选择了数组的最后一个元素作为数据透视。 现在,我知道最佳情况下必须输入哪些输入值,即,将第一个中间元素保持在最后一个位置(枢轴),下一个枢轴应该是下一个中间元素。 但是我必须生成这种最好的情况输入数组,其大小非常大,例如1000、5000、100000 ..,以便进行快速排序。 我可以编写代码,但是任何人都可以帮助我了解如何使用c编程来生成这种最佳情况的输入数组,以便在最后一个数据点进行快速排序。 我只需要像使用c编程来生成这种数组那样的逻辑。
答案 0 :(得分:1)
基本上,您需要执行类似于快速排序本身的分而治之的方法。使用给定输出中的索引范围的函数来做到这一点:
通过递归调用自身来生成上半分区
通过递归调用自身来生成后半分区
在下半部分分区之后插入枢轴值。
要注意的一件事是,由于您只是生成输出而不对任何内容进行排序,因此实际上不必具有任何值作为输入-您可以将范围逻辑地表示为数组中某个索引处的起始值,并且计数。
下面是一些C#代码;这未经测试-如果您想自己做,就不要看。
static int[] GenerateBestCaseQuickSort(int n)
{
var ary = new int[n];
GenerateBestCaseQuickSortAux(ary, 0, n, 1);
return ary;
}
static void GenerateBestCaseQuickSortAux(int[] ary, int start_index, int count, int start_value)
{
if (count == 0)
return;
if (count == 1)
{
ary[start_index] = start_value;
return;
}
int partition1_count = count / 2;
int partition2_count = count - partition1_count - 1; // need to save a spot for the pivot so -1...
int pivot_value_index = start_index + partition1_count;
int pivot_value = start_value + partition1_count;
GenerateBestCaseQuickSort(ary, start_index, partition1_count, start_value);
GenerateBestCaseQuickSort(ary, pivot_value_index, partition2_count, pivot_value+1);
ary[start_index + count - 1] = pivot_value;
}