2012-12-28 61 views
0

我想制作一个程序,它根据矢量的长度对矢量的维数和数量进行排序。 大部分的代码工作,但程序的排序部分does not。 基本上我想要做的是:比较来自数组w中2个位置的bereken_lengte函数的输出。但似乎没有发生。 同样在函数bereken_lengte中,我不能在循环结束后取总和的根。根据C中的长度对矢量进行排序

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

double bereken_lengte(double *array, int dim) 
{ 
    int i, j; 
    double sum = 0.0; 
    for(i=0; i<dim; ++i) 
    sum += pow(array[i],2); 
    return sum; 
} 

void swap(double **p, double **q) 
{ 
    double *tmp; 
    tmp = *p; 
    *p = *q; 
    *q = tmp; 
} 

void sort_vector(double *w[] , int num , int dik) 
{ 
    int i,dim,j; 
    dim = dik; 
    for(i=0;i<num;++i) 
    for(j = 1+i;j<num;++j) 
    { 
     if(bereken_lengte(w[i],dim) > bereken_lengte(w[j],dim) ) 
     swap(&w[i], &w[j]); 
    } 
} 

int main (void) 
{ 
    int dim, num; 
    int i, j,k,l; 
    double **w; 
    scanf ("%d %d", &dim, &num);   /* read N and M */ 
    w = calloc (num, sizeof (double *)); /* allocate array of M pointers */ 
    for (i = 0; i < num; i++) 
    { 
    /* allocate space for N dimensional vector */ 
    w[i] = calloc (dim, sizeof (double)); 
    /* read the vector */ 
    for (j = 0; j < dim; j++) 
    { 
     scanf ("%lf", &w[i][j]); 
    } 
    } 
    sort_vector(w,num,dim); 
    for(k=0; k<num; ++k) 
    { 
    printf("\n"); 
    for(l=0; l<dim; ++l) 
     printf("%f ", w[k][l]); 
    } 
    return 0; 
} 
+3

你们是不是要学习如何编写一个排序的功能,或者你只是想对数据进行排序?如果你只是想对数据进行排序,我建议调用库函数'qsort()'。 – steveha

+1

在添加东西之前初始化总和。 sort_vector会使用qsort()而不是可怕的bubblesort更好。 – wildplasser

+0

我不知道你正在排序的数量有多少,但是如果数量甚至远大于你的数量,你应该考虑一个临时向量结构的方法,每个向量具有一次**的bereken_lengte() ,并在结构中并排使用预先计算的值,并将数组指针作为排序值实体。再加上一个基于'qsort()'的解决方案,你的性能可能会让你感到惊讶,特别是对于数千个向量的数据集。 – WhozCraig

回答

2
double bereken_lengte(double *array, int dim) 
{ 
    unsigned int i; 
    double sum =0.0; 
    for(i=0; i<dim; ++i) 
    sum += pow(array[i],2); 
    return sum; 
} 

总结前刚刚初始化的总和为零。

顺便说一句我改变我为无符号。这是IMnsvHO一个好习惯使用无符号类型指数& &大小变量(它们不会溢出,如果这样做,你会发现它)

UPDATE: 这试图避免INT指数和大小,并使用qsort。 (相当丑陋,因为比较函数只接受两个元素;不要在多线程程序中试试这个...)请注意,我可能会将行和列互换,但这是一种生活方式... gewoon,omdat het kan !

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

double bereken_lengte(double *array, size_t dim) 
{ 
    size_t i; 
    double sum=0.0; 
    for(i=0; i<dim; ++i) 
    sum += pow(array[i],2); 
    return sum; 
} 

     /* this is ugly: qsort only allows only two arguments */ 
static size_t ze_third_argument=0; 
int srt_pdbl(void *l, void *r) 
{ 
double **dl = l, **dr = r; 
double diff; 
diff = bereken_lengte(*dl, ze_third_argument) - bereken_lengte(*dr, ze_third_argument) ; 
return (int) diff; 
} 

void sort_vector(double *w[] , size_t num , size_t dik) 
{ 
ze_third_argument = dik; 
qsort(w, num, sizeof *w, srt_pdbl); 
} 

int main (void) 
{ 
    size_t dim, num; 
    size_t i, j,k,l; 
    double **w; 
    scanf ("%zu %zu", &dim, &num);   /* read N and M */ 
    w = calloc (num, sizeof *w); /* allocate array of M pointers */ 
    for (i = 0; i < num; i++) 
    { 
    /* allocate space for N dimensional vector */ 
    w[i] = calloc (dim, sizeof *w[i]); 
    /* read the vector */ 
    for (j = 0; j < dim; j++) 
    { 
     scanf ("%lf", &w[i][j]); 
    } 
    } 
    sort_vector(w,num,dim); 
    for(k=0; k<num; ++k) 
    { 
    printf("\n"); 
    for(l=0; l<dim; ++l) 
     printf("%f ", w[k][l]); 
    } 
    return 0; 
} 
+0

我改变了我的代码初始化总和和我​​的代码按预期工作。这只是我忽略的事情。谢谢。我不使用sort()的原因是因为即使不使用'qsort()',我也不能使用它(学校) – user1933355

+0

@ user1933355,你应该预先计算每个向量的'bereken_lengte()'*,将其存储和一个结构中的关联向量指针(两个字段),并对这些结构的向量进行排序。现在,现在有一个保证的最小值(n(n-1)/ 2)调用你现在正在做的(冒泡排序)并计算每个eval的两个'bereken_lengte()'值,几乎所有的值都会不必要的重复重重地关注你的表现。 – WhozCraig

+0

@ user1933355:在这种情况下qsort非常难看。关于bereken_lengte()的评论是合适的。您在每次比较时重新计算它,因此(对于vierkante矩阵),您的算法将变为N * N * N,其中包含N * N或N * log(N)。在qsort情况下N * N * log(N),这仍然是可怕的。 – wildplasser

相关问题