执行快速排序时使用GCC编译器在C中进行分段错误

时间:2015-09-01 06:57:48

标签: c gcc fedora quicksort c99

我编写了以下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();
}

请查看并告诉我代码的哪一部分导致此问题。

2 个答案:

答案 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](值)之间的比较中存在类似问题。

设置leftright的循环也会引起悲伤。您应该递增 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。这应该在开头检查,以确保您的函数不会进入无限递归。