c - 执行快速排序时使用 GCC 编译器在 C 中出现段错误

标签 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();
}

请看一下,让我知道是哪部分代码导致了这个问题。

最佳答案

至少,

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类似的原因。

关于c - 执行快速排序时使用 GCC 编译器在 C 中出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32325384/

相关文章:

C: 为什么 &(void *) 和 void** 不兼容?

c - 对于只有一个叶子节点的每个父亲,删除叶子并将其值与父亲相加

c - Linux 上的汇编编译器。纳斯姆还是AS?

ruby-on-rails - 执行 heroku 创建时找不到 libtermcap.so.2 文件

fedora - Fedora 21下如何设置默认窗口管理器?

c - 在 C 中重新初始化 const char 数组不会给出错误

c - 我在这里遇到段错误

linux - 仅为当前用户更新 gcc

GCC 命令从 -Wall 中排除标志?

Eclipse 在 maven 项目中自动完成代码时出现段错误