我的快速排序出现问题,无法正确排序

时间:2019-05-27 12:46:05

标签: c++ quicksort

好的,我正在尝试制作Prima算法,因此我需要对edges数组进行排序,我在这里尝试使用quicksort,但是它没有按计划工作。

#include <iostream>


using namespace std;

void Sort (int arr[100][4], int m, int l) {
     int i,j,x,v;

    i=m;
    j=l;
    x=(i+j)/2;
    do
    {
        while (((arr[i][3]<arr[x][3]))and(i<=l)) i++;
        while (((arr[j][3]>arr[x][3]))and(j>=m)) j--;
        if (i<=j)
        {
        v=arr[i][1];
        arr[i][1]=arr[j][1];
        arr[j][1]=v;
        v=arr[i][2];
        arr[i][2]=arr[j][2];
        arr[j][2]=v;
        v=arr[i][3];
        arr[i][3]=arr[j][3];
        arr[j][3]=v;
        i++;
        j--;
        }
    }
    while (i<=j);
    if (i<l) Sort(arr,i,l);
    if (m<j) Sort(arr,m,j);
}

int main () {
    int i,x,y,z,n,m;
    int a[100][4];
    fill(&a[0][0],&a[0][0]+400,0);
    cout<<"Enter number of nodes and edges\n";
    cin>>n>>m;
    cout<<"Enter edges and their weights\n";
    for (i=0;i<m;i++) {
        cin>>x>>y>>z;
        a[i][1]=min(x,y);
        a[i][2]=max(x,y);
        a[i][3]=z;
        }
    Sort (a,0,m-1);
    for (i=0;i<m;i++) {
        cout<<i+1<<") "<<a[i][1]<<' '<<a[i][2]<<' '<<a[i][3]<<endl;
    }
    return 0;
}

我放的是

5 10

1 2 4

1 3 7

4 1 5

5 1 8

2 3 3

2 4 6

2 5 6

3 4 8

3 5 2

4 5 4

我得到的是 1)3 5 2

2)2 3 3

3)1 4 5

4)1 2 4

5)4 5 4

6)2 5 6

7)2 4 6

8)1 3 7

9)1 5 8

10)3 4 8

我不明白为什么5领先于4。希望您能提供帮助。

2 个答案:

答案 0 :(得分:0)

您可以在(子)数组的中间选择枢轴元素,这很好,但是您在运行分区循环时将其保留在该位置,并依靠它来在那儿住,那不行。使用您的方法,在正常的分区过程中,可能会将透视图交换到其他位置,此后,其余的分区将基于交换到透视图原始位置的键,这可能会有所不同。 / p>

通常的方法是先将枢轴元素交换到数组的一端或另一端,对数组的其余部分进行分区,然后再将枢轴元素交换到其正确位置,这是通过分区过程发现的。 / p>

答案 1 :(得分:0)

更改代码以使用枢轴值而不是枢轴索引,并进行一些修复以使其更像常规的Hoare分区方案:

    i=m-1;
    j=l+1;
    x=arr[(i+j)/2][3];
    while(1)
    {
        while (arr[++i][3] < x);
        while (arr[--j][3] > x);
        if(i >= j)
            return j;
        // ...