我编写了以下C99代码来对固定数组执行快速排序。但是,在打印初始数组后,它会产生分段错误。我现在没有任何调试器,我正在使用KWrite然后终端进行编译和运行。这是代码。
#include <stdio.h>
#define LEN 8
int arr[8] = {3,5,7,1,2,4,6,8};
void printarr()
{
printf("\n");
for (int i = 0; i<LEN; i++)
printf("\t %d", arr[i]);
printf("\n");
}
void quicksort(int _left,int _right)
{
int left = _left;
int right = _right;
int pivot = (left+right)/2;
while (left<=right)
{
while(pivot>arr[left])
left--;
while (pivot<arr[right])
right++;
if(left<=right)
{
int temp = arr[right];
arr[right] = arr[left];
arr[left] = arr[temp];
left++;
right--;
}
}
if (_left<right)
quicksort(_left, right);
else
quicksort(left, _right);
}
int main()
{
int left = 0, right = LEN-1;
printf("Unsorted array:");
printarr();
quicksort(left,right);
printf("Sorted array:");
printarr();
}
请查看并告诉我代码的哪一部分导致此问题。
答案 0 :(得分:3)
至少,
int temp = arr[right];
arr[right] = arr[left];
arr[left] = arr[temp];
将不按照您的想法行事。
您将值(不是索引)存储到第一行的temp
中,然后在第三行中将其用作索引。这根本不会结束。
相反,您希望将该值用作值:
int temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
您在pivot
(索引)和arr[right]/arr[left]
(值)之间的比较中存在类似问题。
设置left
和right
的循环也会引起悲伤。您应该递增 left
,因为您希望将其发送到数组的末尾,并且递减 right
出于类似的原因。
答案 1 :(得分:2)
在您的left = 0
函数的代码quicksort
中。和,
while(pivot>arr[left])
left--;
此处,如果left
值超过pivot
,即arr[left]
,则此代码中arr[0]
将转为负值。这很可能导致您的代码seg fault
。
我认为根据您的代码,正确的版本将是
while(pivot>arr[left]) //elements < pivot on the left side
left++;
while (pivot<arr[right]) //elemenst > pivot in the right side
right--;
注意强>
另请注意,我在递归调用中找不到任何终止条件。
当满足某个条件时,您希望您的递归能够克服。在这种情况下_left >= _right
。这应该在开头检查,以确保您的函数不会进入无限递归。