我有个长度很大的一维数组怎么排序?

C语言 码拜 9年前 (2015-05-11) 1089次浏览 0个评论
 

是这样的  因为编程要求,我先是声明了一个3列动态二维数组s[m][3],接下来是要根据s[i][3],就是第三列的数据对整个二维数组进行降序排序。我试验了一下倘若数据m比较小就可以实现排序,如果m比较大时,就不行了,更不要谈350000了
代码如下: MAX_LINES即为s的行数 谢谢各位
#define MAX_LINES 302
#include “stdlib.h”
#include “stdio.h”

int main()
{
    ///order

  int (*s)[3];
int i,j;
int n;
int tempg;
   int tempx;
   int tempy;
   n=MAX_LINES;
  
  s=(int(*)[3])malloc(n*3*sizeof(int));
  for(i=0;i<MAX_LINES-1;i++)  //
  {s[i][1]=i;s[i][2]=i+1;s[i][3]=i;
printf(“%d\n”,s[i][3]);
  }

  for(i = 0; i <MAX_LINES-2;i++){
  for(j=i;j<MAX_LINES-1;j++){
  //printf(“%d\n”,j);
   if(s[i][3] < s[j][3])
   {       
      tempx=s[i][1];
           tempy=s[i][2];
         tempg= s[i][3];
s[i][1] = s[j][1];
    s[i][2] =s[j][2];
s[i][3] = s[j][3];
   s[j][1]=tempx;
s[j][2]=tempy;
s[j][3]=tempg; }

   }
  }
for(i=0;i<MAX_LINES-1;i++){
 printf(“%d\n”,s[i][3]);
}
  free(s);
  return 0;
}

30分
应该是

s[i][0],s[i][1],s[i][2]

而不是

s[i][1],s[i][2],s[i][3]

第三列是s[i][2]。
另外C语言里有个排序函数qsort
另附参考代码

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

int comp(const void * a,const void * b)
{
	return (*(int(*)[3])b)[2]-(*(int(*)[3])a)[2]; // 这里表示降序
}

int main()
{
	size_t count,i,j;
	int (*datas)[3]=NULL;
	clock_t cl;
	scanf("%zu",&count);
	datas=(int(*)[3])malloc(count*sizeof(int[3]));
	if(NULL==datas)
	{
		fputs("内存不足",stderr);
		return 1;
	}

	srand(time(NULL));
	for(i=0;i<count;++i)
		for(j=0;j<3;++j)
			datas[i][j]=rand(); // 生成随机数据

	cl=clock();
	qsort(datas,count,sizeof(int[3]),comp); // 快速排序
	cl=clock()-cl;

	for(i=1;i<count;++i)
		if(datas[i][2]>datas[i-1][2]) // 如果后者大于前者,则排序有错误。
			break;
	if(i==count)
		puts("排序正确");
	else
		puts("排序错误");

	printf("time:%lf\n",(double)cl/CLOCKS_PER_SEC); // 排序时间

	free(datas);
	return 0;
}
10分
“多一少一”问题占程序员常犯错误的10%以上!
避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,搬手指头心算验证一下程序到底应该写为
x、x-1、x+1中的哪个?
<、<=、==、>、>=中的哪个?
什么叫做根据第三列数据排序?
确实hi下标的原因 汗  

引用 楼主 dadaobiancheng 的回复:

是这样的  因为编程要求,我先是声明了一个3列动态二维数组s[m][3],接下来是要根据s[i][3],就是第三列的数据对整个二维数组进行降序排序。我试验了一下倘若数据m比较小就可以实现排序,如果m比较大时,就不行了,更不要谈350000了
代码如下: MAX_LINES即为s的行数 谢谢各位
#define MAX_LINES 302
#include “stdlib.h”
#include “stdio.h”

int main()
{
    ///order

  int (*s)[3];
int i,j;
int n;
int tempg;
   int tempx;
   int tempy;
   n=MAX_LINES;
  
  s=(int(*)[3])malloc(n*3*sizeof(int));
  for(i=0;i<MAX_LINES-1;i++)  //
  {s[i][1]=i;s[i][2]=i+1;s[i][3]=i;
printf(“%d\n”,s[i][3]);
  }

  for(i = 0; i <MAX_LINES-2;i++){
  for(j=i;j<MAX_LINES-1;j++){
  //printf(“%d\n”,j);
   if(s[i][3] < s[j][3])
   {       
      tempx=s[i][1];
           tempy=s[i][2];
         tempg= s[i][3];
s[i][1] = s[j][1];
    s[i][2] =s[j][2];
s[i][3] = s[j][3];
   s[j][1]=tempx;
s[j][2]=tempy;
s[j][3]=tempg; }

   }
  }
for(i=0;i<MAX_LINES-1;i++){
 printf(“%d\n”,s[i][3]);
}
  free(s);
  return 0;
}


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明我有个长度很大的一维数组怎么排序?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!