为什么我的阵列没有改变?快速排序尝试

Why doesn't my array change? Quicksort attempt

本文关键字:快速排序 改变 我的 阵列 为什么      更新时间:2023-10-16

在维基百科关于快速排序的文章中,有一种特定的编码方式("最简单的")的草图,我尝试了一下

#include <cstdlib>
#include <iostream>
using namespace std;
int partition(int list[10], int high, int low);
void quicksort(int list[10], int high, int low);
int partition(int list[], int high, int low){
    int pivot = list[high];
    int i = list[low];
    int swap_temp;
    for (int j=0; j<high; j++){
        if (list[j]<pivot){
            swap_temp=list[high];
            list[high]=list[j];
            list[j]=swap_temp;
            i++;
        }
    }
    swap_temp = list[high];
    list[high]=list[i];
    list[i]=swap_temp;
    return i;
}
void quicksort(int list[], int high, int low){
    if (low<high){
        int p=partition(list, high, low);
        quicksort(list,low,p-1);
        quicksort(list,p+1,high);  
    }
}
int main() {
    int list[10]={3,5,1,6,34,224,23,62,124,57};
    int low=0, high=10;
    quicksort(list,low,high);
    for (int k=0; k<high; k++){
        cout << list[k] << endl;
    }
    return 0;
}

编译得很好,但是输出只是原始列表,完全没有改动。我已经研究过如何将数组传递给函数,我在这里所做的在其他程序中也有效(我专门编写了一个程序来检查,它接受一个整数数组,并将每个元素加倍,这很好)。算法在这里完全指定。为什么程序不改变数组?

您应该正确划分和快速排序函数。我认为你错误地在快速排序函数中传递高低倒序在配分函数中的for循环你应该从低开始。下面的代码可以为你工作。

#include <cstdlib>
#include <iostream>

using namespace std;

int partition(int list[10], int high, int low);
void quicksort(int list[10], int high, int low);

int partition(int list[], int low, int high){
int pivot = list[high];
int i = low-1;
int swap_temp;
for (int j=low; j<high; j++){
    if (list[j]<pivot){
    i++;
        swap_temp=list[j];
        list[j]=list[i];
        list[i]=swap_temp;
    }
}
i++;
swap_temp = list[high];
list[high]=list[i];
list[i]=swap_temp;
return i;
}

void quicksort(int list[], int low, int high){
if (low<high){
    int p=partition(list, low, high);
    quicksort(list,low,p-1);
    quicksort(list,p+1,high);  
}
}

int main() {
int list[10]={3,5,1,6,34,224,23,62,124,57};
int low=0, high=10;
quicksort(list,low,high-1);
for (int k=0; k<high; k++){
    cout << list[k] << endl;
}
return 0;
}