簡體   English   中英

使用導致段錯誤的指針進行快速排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM