arrays - 带有导致段错误的指针的快速排序

标签 arrays c segmentation-fault quicksort

我正在尝试采用标准的快速排序算法,并通过采用分区函数对其进行稍微修改,使其不再采用整个数组、低索引和高索引,而是采用指向低索引的指针'th 元素以及我想要分区的元素数量。但是,我遇到了段错误,但我无法弄清楚。感谢您的帮助。

#include <stdio.h>

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

int partition(int *array, int high) {
  int pivot = array[high];
  int i = 0;

  for (int j = 0; j < high; j++) {
    if (array[j] <= pivot) {
      swap(&array[i++], &array[j]);
    }
  }

  swap(&array[i], &array[high]);
  return i;
}

void quickSort(int *array, int low, int high) {
  if (low < high) {
    int pi = partition(array + low, high - low);
    quickSort(array, low, pi - 1);
    quickSort(array, pi + 1, high);
  }
}

void printArray(int array[], int size) {
  for (int i = 0; i < size; ++i) {
    printf("%d  ", array[i]);
  }
  printf("\n");
}

int main() {
  int data[] = {8, 7, 2, 1, 0, 9, 6};
  
  int n = sizeof(data) / sizeof(data[0]);
  
  printf("Unsorted Array\n");
  printArray(data, n);
  
  // perform quicksort on data
  quickSort(data, 0, n - 1);
  
  printf("Sorted array in ascending order: \n");
  printArray(data, n);
}

最佳答案

在您的代码中给出以下内容:

int pi = partition(array + low, high - low);
quickSort(array, low, pi - 1);
quickSort(array, pi + 1, high);

您使用指针调整基数 (array+low) 进行分区,并分段纯长度 (high-low)。如果这就是您的分区实现的工作方式(大多数情况都是如此),那很好。但您需要记住生成的枢轴位置 pi 将基于该段中的位置; 不在整个数组中。您需要在递归时通过放回配置分区的原始偏移量来对此进行调整:

int pi = partition(array + low, high - low);
quickSort(array, low, low + pi - 1);   // <== LOOK
quickSort(array, low + pi + 1, high);  // <== HERE

仅此更改就可以让您的实现运行起来。还有其他方法可以做到这一点,当/如果我有时间的话,我会用其中的一些方法更新这个答案。

关于arrays - 带有导致段错误的指针的快速排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71301570/

相关文章:

C: 在 Linux 上可靠地导致 `double free or corruption`

c++ - C++ 中的 3 维 vector -传递给函数之前的部分大小定义

c - "Segmentation fault (core dumped)"代表 : "No such file or directory" for libioP. h、printf-parse.h、vfprintf-internal.c 等

Javascript 字符串操作

javascript - 无法从 javascript 中的原型(prototype)访问构造函数的值?

java - 我需要创建一个 Jpanel 数组,但还需要使用按钮将正确的面板设置为按下时可见

c - 代码块中缺少 "argc, argv"

python - numpy 一维数组 : mask elements that repeat more than n times

c - 将文件读入数组

c - 为什么在尝试打印数组时出现段错误?