2012-12-28 92 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

相關問題