C语言中的快速排序

C语言中的快速排序,c,C,我正在尝试对我的项目使用快速排序,但它不起作用。我不知道bug在哪里。有谁能帮我弄明白吗?多谢各位 void quicksort(int arr[],int a, int b){ if(a<=b){ int key=arr[a]; int index=a; int i=a, j=b; while(i<=j){ for(;arr[j]>key;--j); int

我正在尝试对我的项目使用快速排序,但它不起作用。我不知道bug在哪里。有谁能帮我弄明白吗?多谢各位

void quicksort(int arr[],int a, int b){
    if(a<=b){
        int key=arr[a];
        int index=a;
        int i=a, j=b;
        while(i<=j){
            for(;arr[j]>key;--j);
            int temp=arr[j];
            arr[j]=key;
            arr[index]=temp;
            index=j;
            for(;arr[i]<key;++i);
            temp=arr[i];
            arr[i]=key;
            arr[index]=temp;
            index=i;
            }
        quicksort(arr,a,index);
        quicksort(arr,index,b);
        }
    else return;
} 
void快速排序(int-arr[],int-a,int-b){
如果(aC)已经带有进行快速排序的功能。

为什么

arr[j]=key;
因为你应该在波普尔的位置只放一次枢轴

和呼唤

    quicksort(arr,a,index);
    quicksort(arr,index,b);
也有气味,因为你有低指数和高指数相同

在谷歌的qucksort上查看这段精彩视频(包括大量代码和解释)


您的内部循环执行以下操作:

  • 从数组的右侧进行检查,以查找应位于
    键的左侧的元素
  • 使用位于
    索引的
    交换找到的任何元素,并将
    索引
    更新到
    的新位置
  • 从数组的左侧进行检查,以找到应位于
    键的右侧的元素
  • 使用位于
    索引的
    交换找到的任何元素,并将
    索引
    更新到
    的新位置
你到底为什么要这样做?你应该这样做:

  • 从数组的右侧进行检查,以查找应位于
    键的左侧的元素
  • 从数组的左侧进行检查,以找到应位于
    键的右侧的元素
  • 如果找到,交换它们。如果没有,将枢轴放在正确的位置并退出循环
我不是百分之百确定,但我认为在您的quicksort版本中反复使用
可能是问题的罪魁祸首。找出问题的最佳方法是一步一步地调试代码,看看哪里出了问题

下面是根据我上述建议的实现,以及一些测试用例:

void swap(int arr[], int i, int j) {
    int temp = arr[j];
    arr[j] = arr[i];
    arr[i] = temp;
}

void quicksort0(int arr[], int a, int b) {
    if (a >= b)
        return;

    int key = arr[a];
    int i = a + 1, j = b;
    while (i < j) {
        while (i < j && arr[j] >= key)
            --j;
        while (i < j && arr[i] <= key)
            ++i;
        if (i < j)
            swap(arr, i, j);
    }
    if (arr[a] > arr[i]) {
        swap(arr, a, i);
        quicksort0(arr, a, i - 1);
        quicksort0(arr, i + 1, b);
    } else { // there is no left-hand-side
        quicksort0(arr, a + 1, b);
    }
}

void quicksort(int arr[], int len) {
    quicksort0(arr, 0, len - 1);
}

int main() {
    int a1[] = { };
    int a2[] = { 1 };
    int a3[] = { 1, 1 };
    int a4[] = { 1, 2, 3, 4, 5 };
    int a5[] = { 5, 4, 3, 2, 1 };
    int a6[] = { 9, 2, 6, 7, 5, 4, 0, 2, 7, 5 };

    quicksort(a1, 0);
    quicksort(a2, 1);
    quicksort(a3, 2);
    quicksort(a4, 5);
    quicksort(a5, 5);
    quicksort(a6, 10);
    quicksort(a6, 10);
}
void swap(int arr[],int i,int j){
内部温度=arr[j];
arr[j]=arr[i];
arr[i]=温度;
}
void quicksort0(int arr[],int a,int b){
如果(a>=b)
返回;
int key=arr[a];
int i=a+1,j=b;
而(i=键)
--j;
而(i为什么你认为你有一个bug?你的程序崩溃了吗?产生了意想不到的结果吗?或者这样想:如果你把这个问题作为电子邮件发送给你的教授,你真的认为你的教授会倾向于响应吗?如果你使用C++,你应该避免<代码> qSoS> <代码>,而使用<代码> STD::排序< /COD>。代码>排序
将更安全、更易于使用,而且可能更快。
qsort
不一定实现快速排序。
qsort
的算法未按标准指定:
qsort
不应与快速排序混淆。