[英]Quicksort with pointers causing segfault
我正在嘗試采用標准的快速排序算法,並通過采用分區 function 並對其進行稍微修改,而不是采用整個數組、低索引和高索引,而是采用指向低元素的指針以及我要划分的元素數量。 但是,我遇到了分段錯誤,我無法弄清楚。 謝謝您的幫助。
#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
) 進行分區。 如果這就是您的分區實現的工作方式(大多數情況下如此),那很好。 但是您需要記住生成的 pivot 位置pi
將基於該段中的 position; 不在整體陣列中。 在遞歸時,您需要通過從配置該分區的位置放回原始偏移量來對此進行調整:
int pi = partition(array + low, high - low);
quickSort(array, low, low + pi - 1); // <== LOOK
quickSort(array, low + pi + 1, high); // <== HERE
僅此更改就應該使您的實施運行起來。 還有其他方法可以做到這一點,如果我有時間,我會用其中的幾個來更新這個答案。
使用 Hoare 分區方案的基於指針的快速排序的替代版本:
void QuickSort(int *lo, int *hi)
{
int *i, *j;
int p, t;
if(lo >= hi)
return;
p = *(lo + (hi-lo)/2);
i = lo - 1;
j = hi + 1;
while (1){
while (*(++i) < p);
while (*(--j) > p);
if (i >= j)
break;
t = *i;
*i = *j;
*j = t;
}
QuickSort(lo, j);
QuickSort(j+1, hi);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.