#include <stdio.h>
void temp(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void quicksort(int *a,int left,int right)
{
int f,start,end;
start=left;
end=right;
f=left;
while(left<right)
{
while(a[right]>=a[f]&&right>left)
right--;
while(a[left]<=a[f]&&left<right)
left++;
temp(a+left,a+right);
}
temp(a+left,a+f);
quicksort(a,start,left-1);
quicksort(a,left+1,end);
}
int main()
{
int a[10]={7,4,1,2,5,8,3,6,9,10};
quicksort(a,0,9);
for(int i=0;i<10;i++)
printf("%d ",a[i]);
}
c语言快速排序找问题
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
6条回答 默认 最新
关注此回答引用GPT4,由博主鑫宝Code参考后得出
您提供的C语言代码实现了一个快速排序算法,但其中存在一个逻辑错误。在
while(left<right)循环中,你没有正确更新枢轴(pivot)的位置。以下是修正后的代码:#include <stdio.h> void swap(int *a, int *b) { int t; t = *a; *a = *b; *b = t; } void quicksort(int *a, int left, int right) { if (left >= right) return; // 如果left已经大于等于right,说明数组只有一个或零个元素,无需继续分割 int f = a[left]; // 将最左边的元素作为初始枢轴 int i = left, j = right; while (i < j) { while (a[j] >= f && i < j) { j--; } while (a[i] <= f && i < j) { i++; } if (i < j) { // 防止在i和j交叉时依然交换 swap(a + i, a + j); } } // 将枢轴元素放到最终位置 a[left] = a[i]; a[i] = f; // 递归对左右两边进行快速排序 quicksort(a, left, i - 1); quicksort(a, i + 1, right); } int main() { int a[10] = {7, 4, 1, 2, 5, 8, 3, 6, 9, 10}; quicksort(a, 0, 9); for (int i = 0; i < 10; i++) { printf("%d ", a[i]); } printf("\n"); return 0; }主要修改点:
- 添加了当
left >= right时直接返回的条件,以避免处理单个或零个元素的情况。 - 在
while循环外部移动枢轴元素到其最终位置。 - 修改
swap函数名称为swap,使其更具可读性。
现在这段代码应该能正确地对数组进行快速排序了。
本回答被专家选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- 添加了当