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;
}
题主的代码,排序函数里少了递归的返回判断,见注释,供参考:
#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;
}