2012-12-28 3 views
0

길이를 기준으로 정렬 할 벡터의 차원과 수를 가져 오는 programm을 만들고 싶습니다. 대부분의 코드는 작동하지만 프로그램의 정렬 부분은 작동하지 않습니다. 기본적으로 내가하고 싶은 일은 배열 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()를 사용하는 것이 좋습니다. – wildplasser

+0

당신이 이들 중 몇 개를 정렬할지 모르겠다.하지만 그 숫자가 원격으로 크기가 크다면, 각 벡터에 대해 한번 계산 된 'bereken_lengte()'**가있는 구조체 접근법의 임시 벡터를 고려해야한다 배열 포인터를 정렬 값 엔터티와 함께 ​​struct에서 미리 계산 된 값을 사용합니다. '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; 
} 

다만 합산 전에 제로 합계를 초기화.

동의어 i를 i로 변경했습니다. 좋은 습관이 (가 언더되지 않으며 경우에, 당신이 그것을 알 수 있습니다) 인덱스 & & 크기 변수를 부호없는 형식을 사용하는 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

나는 initialising sum으로 코드를 변경했고 코드는 예상대로 작동한다. 간과 한 것이 었습니다. 고맙습니다. 내가 sort()를 사용하지 않는 이유는'qsort()'를 사용하지 않아도 (학교) – user1933355

+0

@ user1933355 사용할 수 없기 때문에 각 벡터 *의 bereken_lengte()를 미리 계산하고 저장해야합니다 및 관련 벡터 포인터를 구조체 (두 개의 필드)에 저장하고 해당 구조체의 벡터를 정렬합니다. 현재는 (n (n-1)/2) 개의 최소값을 보증하고 (거품 정렬), 평가 당 두 개의'bereken_lengte()'값을 계산합니다. 거의 모든 것이 불필요하게 반복됩니다. 당신의 수행에 무겁게 무게를 잰다. – WhozCraig

+0

@ user1933355 : qsort는이 경우 매우 추합니다. bereken_lengte()에 대한 설명은 적합합니다. 매번 비교할 때마다 다시 계산하므로, 알고리즘은 N * N 또는 N * log (N)의 N * N * N으로 바뀝니다. qsort의 경우 N * N * log (N)이며 이는 여전히 끔찍합니다. – wildplasser