【问题标题】:QuickSort with only two arguments只有两个参数的快速排序
【发布时间】:2021-12-14 21:32:30
【问题描述】:

如何构造一个以数组和数组长度为两个参数的快速排序算法?

即:

void quick_sort(int A[], int n)

像这样。

但是,我只熟悉使用 3 个参数、一个数组、最低索引和最高索引编写快速排序。

下面的 Quicksort 函数接受 3 个参数,arrlh

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int partition(int arr[], int l, int h) {
    int pivot = arr[l];
    int i = l;
    int j = h;

    while (i < j) {

        while (arr[i] <= pivot) {
            i++;
        }
        while (arr[j] > pivot) {
            j--;
        }
        if (i < j) {
            swap(&arr[j], &arr[i]);
        }
    }
    swap(&arr[l], &arr[j]);
    return j;
}

void quickSort(int arr[], int l, int h) {
    if (l < h) {
        int j = partition(arr, l, h);
        quickSort(arr, l, j - 1);
        quickSort(arr, j + 1, h);
    }
}

但是,我需要编写一个只有两个参数的 QuickSort 实现。

你如何编写执行相同排序的函数? 也就是说,我们只有n的长度,而上面的完整快速排序算法有lh作为参数。

【问题讨论】:

  • 你可以传递一个缩短的数组。例如,您可以传递 (array=arr+3, length=10-3),而不是传递 (array=arr, startindex=3, length=10)。
  • n 显然是一个非常没用的名字...第二个参数 (int n) 应该是什么意思?
  • @Alexander 很抱歉造成混乱。 int n 表示数组的长度。
  • @EdmCoff 感谢您的建议!我会试试的。
  • @Haya_05120512 你不需要道歉。亚历山大很为难。在这种情况下,n 显然是一个非常明显的名称。

标签: arrays c sorting quicksort


【解决方案1】:

许多代码为实际工作功能提供了一个很好的界面。例如,快速排序算法可能会将自己呈现为:

void quickSort( int * xs, int n );

但被实现为:

static int partition( int * xs, int left, int right )
{
  ...
}

static void quickSort_( int * xs, int left, int right )
{
  ...
}

void quickSort( int * xs, int n )
{
  quickSort_( xs, 0, n );
}

注意实际的主力函数是如何static 到用户看不到它们的库的。

【讨论】:

  • size_t 用于nleftright 参数似乎更可取,尽管不是OP 的要求。
  • @chqrlie - 再看一遍,这不是无符号整数问题的典型实现。我删除了我之前的评论。
猜你喜欢
  • 1970-01-01
  • 2018-10-31
  • 2015-05-29
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多