使用指针而不是索引进行归并排序

Mergsort using pointers rather than indices?

本文关键字:索引 归并排序 指针      更新时间:2023-10-16

所以我需要写一个归并排序算法,其中

在排序过程中,应该使用

指针而不是数组索引来访问数组元素,因此该方法取2个int指针,highlow,并从那里开始工作。

问题:

是否可以对数组进行排序而不索引它,或者参数应该是指针而不是值?

注:非常不熟悉指针操作,谢谢你的帮助!

由于数组是一个连续的内存块,因此可以像使用索引一样使用指针来访问数组成员:

int array[] = {1, 2, 3, 4, 5};
int *pointer = array;
int x = *(pointer + 1);
// x = 2

编译器根据数据大小自动计算偏移量:sizeof(int) .

对于你的项目,如果给你一个指针指向数组的第一个和最后一个元素,你可以在中间分割数组:

int *middle = firstPointer + ((lastPointer - firstPointer) / 2);

然后你可以继续递归地做

合并排序对两次运行(数组的一部分)中的每次输入和一次运行(输出数组的一部分)的输出使用顺序访问。您可以使用前进1的本地指针,而不是从基指针索引。所以主合并过程看起来像这样:

    int * plft = left;           // ptr to left run
    int * prgt = right;          // ptr to right run
    int * pdst = destination;    // ptr to output
    // loop with checks for reaching end of either left or right run
        if(*plft <= *prgt)       // at some point in the merge function
            *pdst++ = *plft++;
        else
            *pdst++ = *prgt++;

问题没有提到目标是实现自顶向下(使用递归将指针填充堆栈,直到运行大小== 1,然后开始合并并返回)还是自底向上的合并排序(跳过递归步骤,初始化运行大小为1,合并数组中的运行对直到所有对合并,然后运行大小*= 2,重复直到运行大小>=数组大小)。

wiki文章展示了自顶向下和自底向上归并排序的简单示例。

http://en.wikipedia.org/wiki/Merge_sort