快速排序算法出现报错代码没问题但不知道什么原因。


void quckSort(int arr[], int L,int R) {
    int i = L;
    int j = R;
    int pivot = arr[i];
    while (i < j) {
        while (i < j && arr[j] >= pivot) {
            j--;
        }
        arr[i] = arr[j];
        while (i < j && arr[i] <= pivot) {
            i++;
        }
        arr[j] = arr[i];
    }
    arr[i] = pivot;
    quckSort( arr, L, i-1);
    quckSort( arr, i + 1, R);
}


int main() {
    //定义一个数组
    int arr[] = { 9,5,4,1,2,6,3,7,8 };
    int j;
    int len = sizeof(arr) / sizeof(arr[0]);
    int L = 0;
    int R = len-1;
    for (j = 0; j < len; j++)
    {
        printf("%d", arr[j]);
    }
    printf("\n-------------\n");
    quckSort(arr, L, R);
    int i;
    for (i = 0; i < len; i++) {
        printf("%d", arr[i]);
    }
    return 0;
}

img

题主的代码,排序函数里少了递归的返回判断,见注释,供参考:

#include <stdio.h>
void quckSort(int arr[], int L,int R) {
    if (L >= R)                   //缺了递归的返回条件判断
        return;
    int i = L;
    int j = R;
    int pivot = arr[i];
    while (i < j) {
        while (i < j && arr[j] >= pivot) {
            j--;
        }
        arr[i] = arr[j];
        while (i < j && arr[i] <= pivot) {
            i++;
        }
        arr[j] = arr[i];
    }
    arr[i] = pivot;
    quckSort( arr, L, i-1);
    quckSort( arr, i + 1, R);
}


int main() {
    //定义一个数组
    int arr[] = { 9,5,4,1,2,6,3,7,8 };
    int j;
    int len = sizeof(arr) / sizeof(arr[0]);
    int L = 0;
    int R = len-1;
    for (j = 0; j < len; j++)
    {
        printf("%d", arr[j]);
    }
    printf("\n-------------\n");
    quckSort(arr, L, R);
    int i;
    for (i = 0; i < len; i++) {
        printf("%d", arr[i]);
    }
    return 0;
}

在快速排序的实现中,出现了一个问题,即当数组中存在重复元素时,该算法可能会进入死循环,导致程序无法终止。

这是由于当数组中存在多个与pivot相等的元素时,交换这些元素的过程可能导致i和j在同一位置上来回移动,从而无法递归排序数组的其他部分。

要解决这个问题,可以将while循环中的“<=”和“>=”改为“<”和“>”,即:

while (i < j && arr[j] > pivot) {
    j--;
}
arr[i] = arr[j];
while (i < j && arr[i] < pivot) {
    i++;
}
arr[j] = arr[i];

这样做可以避免将pivot与重复元素交换,并且可以确保快速排序可以正确地处理数组中包含重复元素的情况。

修改后的快速排序代码如下所示:

void quickSort(int arr[], int L, int R) {
    int i = L;
    int j = R;
    int pivot = arr[i];
    while (i < j) {
        while (i < j && arr[j] > pivot) {
            j--;
        }
        arr[i] = arr[j];
        while (i < j && arr[i] < pivot) {
            i++;
        }
        arr[j] = arr[i];
    }
    arr[i] = pivot;
    quickSort(arr, L, i - 1);
    quickSort(arr, i + 1, R);
}

希望对你有帮助!

void quickSort(int arr[], unsigned int low, unsigned int high) {
    if (low >= high) {
        return;
    }
    unsigned int left = low, right = high;
    int pivot = arr[left];
    while (left < right) {
        while (left < right && arr[right] >= pivot) right--;
        arr[left] = arr[right];
        while (left < right && arr[left] <= pivot) left++;
        arr[right] = arr[left];
    }
    arr[left] = pivot;
    quickSort(arr, low, left - 1);
    quickSort(arr, left + 1, high);
}

int main() {
    //定义一个数组
    int arr[] = { 9,5,4,1,2,6,3,7,8 };
    int len = sizeof(arr) / sizeof(arr[0]);
    unsigned int low = 0, high = len - 1;
    for (int j = 0; j < len; j++)
    {
        printf("%d ", arr[j]);
    }
    printf("\n-------------\n");
    quickSort(arr, low, high);
    for (int i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}