好的,我正在尝试制作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。希望您能提供帮助。
答案 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;
// ...