C语言中基于长度的排序向量
我想做一个程序,根据向量的长度对向量的维数和数量进行排序。 大多数代码都能工作,但程序的排序部分不能。 基本上我想做的是:比较数组w中两个位置的bereken_lengte函数的输出。但似乎什么也没发生。 同样在函数bereken_lengte中,我不能在循环结束后求和的根C语言中基于长度的排序向量,c,vector,C,Vector,我想做一个程序,根据向量的长度对向量的维数和数量进行排序。 大多数代码都能工作,但程序的排序部分不能。 基本上我想做的是:比较数组w中两个位置的bereken_lengte函数的输出。但似乎什么也没发生。 同样在函数bereken_lengte中,我不能在循环结束后求和的根 #include <stdio.h> #include <stdlib.h> #include <math.h> double bereken_lengte(double *array,
#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;
}
#包括
#包括
#包括
双贝雷肯长度(双*阵列,整数尺寸)
{
int i,j;
双和=0.0;
对于(i=0;idouble-bereken_-lengte)(双*数组,int-dim)
{
无符号整数i;
双和=0.0;
对于(i=0;i您是想学习如何编写排序函数,还是只想对数据进行排序?如果您只想对数据进行排序,我建议调用库函数qsort()
。在添加内容之前初始化sum。使用qsort()排序向量会更好吗而不是可怕的冒泡。我不知道有多少你正在排序,但如果数量变得甚至相当大,你应该考虑一个临时向量的结构方法,有<代码> BeeKeNeLangTrand()
为每个向量计算一次,并将结构中的预计算值与数组指针并排用作排序值实体。将其与qsort()耦合
-基于解决方案和您的性能可能会让您感到惊讶,尤其是对于数千个向量的数据集。我使用初始化和更改了代码,代码正常工作。这只是我忽略的一点。谢谢。我之所以不使用sort()是因为我无法使用它(学校)@user1933355即使不使用qsort()
,您也应该预先计算每个向量的bereken_lengte()
,将其和关联的向量指针存储在一个结构中(两个字段),并对这些结构的向量进行排序。现在,有一个保证的最小值(n(n-1)/2)调用您现在正在执行的操作(气泡排序)每次评估计算两个bereken_lengte()
值(几乎所有值都是不必要的重复)将对您的性能产生重大影响。@user1933355:qsort在这种情况下非常难看。关于bereken_lengte()的注释是恰当的。您在每次比较时都会重新计算它,因此(对于vierkante矩阵)你的算法将变成NNN而不是NN或Nlog(N)。在qsort的例子中,NNlog(N)仍然很糟糕。
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;
}
#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;
}