【问题标题】:Quick Sort Time Complexity Best Case Input快速排序时间复杂度最佳案例输入
【发布时间】:2020-01-01 17:21:45
【问题描述】:

我必须在 c 程序中为 BEST CASE INPUT 找到快速排序的时间复杂度,并且我选择了数组的最后一个元素作为枢轴。 现在我知道最好的情况下我必须输入哪些输入值,即,将第一个中间元素保留在最后一个位置(枢轴)&下一个枢轴应该是下一个中间元素。 但我必须生成这种非常大的最佳案例输入数组,如 1000、5000、100000 ..,以便快速排序。 我可以编码,但任何人都可以帮助我了解如何使用 c 编程生成那种最佳情况输入数组,以便使用最后一个枢轴进行快速排序。 我只需要诸如如何使用 c 编程生成这种数组的逻辑。

【问题讨论】:

  • 该问题未指定是否使用 Lomuto 或 Hoare 分区类型方案。 Lomuto 会更简单,因为在进行递归调用时,枢轴已经到位并被排除在外。使用 Hoare 分区方案,枢轴元素可以在任何地方结束,并且在每个步骤中都将包含在左侧或右侧子分区中。

标签: algorithm sorting input time-complexity quicksort


【解决方案1】:

基本上,您需要采用类似于快速排序本身的分而治之的方法。使用在输出中给出一系列索引的函数来执行此操作:

  1. 通过递归调用自身来生成前半部分

  2. 通过递归调用自身生成后半分区

  3. 在后半分区后插入基准值。

需要注意的一点是,由于您只是生成输出而不是对任何内容进行排序,因此您实际上不必将任何值作为输入——您可以在逻辑上将范围表示为数组中某个索引处的起始值,并且计数。

下面是一些 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2020-08-08
    • 1970-01-01
    相关资源
    最近更新 更多