首页 > 黑龙江 > 大兴安岭 > c语言排序函数,用C语言如何对大量数字进行排序

c语言排序函数,用C语言如何对大量数字进行排序

来源:整理 时间:2023-08-07 19:48:39 编辑:好学习 手机版

1,用C语言如何对大量数字进行排序

如果是C语言的话只能手写堆排序、归并排序或者快速排序等等如果是用C++的话可以看下面:10W量级直接考虑使用STL的sort函数,用法自行百度或者参见http://www.cplusplus.com/reference/algorithm/sort/sort函数默认是升序排序,要降序排序可以传cmp函数过去或者sort完了reverse1000W量级考虑使用计数排序或者基数排序,这两种排序对被排序数字的大小有一定限制如果是1000W量级的实数排序,或者数字可能很大的话,那么还是回到之前说的sortSTL里提供了很多O(nlogn)级别的排序函数,比如sort、qsort、stable_sort另外还有简化归并排序代码用的merge函数等等以上所有函数均能在cplusplus.com查到详细用法
”数组的长度定义是有限的,1万还能运行通过,太大的话编译就不通过。“如果不能完全读入数组,则就无法进行有效的排序了!”且将1万条数据排序的效率也很低,要5秒多。。。“一般排序用系统自带的qsort()函数,快慢与机器性能有关。

用C语言如何对大量数字进行排序

2,C语言编写按分数排序的函数

楼上的用的是C++若单纯的用C那就是这样#include#define print "NO.%d %d %d %d %d %3.2f %3.2f\n",1+i,stu[i].num,stu[i].mat,stu[i].ENG,stu[i].com,stu[i].aver,stu[i].total//宏定义节约时间struct studentint num;int mat;int ENG;int com;float aver;float total;}stu[10];//定义结构体变量void main()void take_turn_print(struct student stu1[10]) ;float sum(int x,int y,int z);//声明求和函数for(i=0;i<10;i++)scanf("%d%d%d%d",&stu[i].num,&stu[i].mat,&stu[i].ENG,&stu[i].com);for(i=0;i<10;i++)stu[i].total=sum(stu[i].mat,stu[i].ENG,stu[i].com);//调用求和函数stu[i].aver=stu[i].total/3;}take_turn_print(stu);//调用排序 打印函数}void take_turn_print(struct student stu1[10])void change(int *x,int *y);//声明换位函数void change1(float *x,float *y);//声明换位函数int i,j;for(j=0;j<9;j++)//冒泡排序 为理解简单 就没用别的排序方法 哈哈for(i=0;i<9-j;i++)if(stu1[i].averchange(&stu1[i].num,&stu1[i+1].num);// 值交换change(&stu1[i].mat,&stu1[i+1].mat);// 值交换change(&stu1[i].ENG,&stu1[i+1].ENG);// 值交换change(&stu1[i].com,&stu1[i+1].com);// 值交换change1(&stu1[i].aver,&stu1[i+1].aver);// 值交换change1(&stu1[i].total,&stu1[i+1].total);// 值交换}}}for(i=0;i<10;i++)printf(print);//打印}void change(int *x,int *y)int i;i=*x;*x=*y;*y=i;//利用指针做变量替换}void change1(float *x,float *y)float i;i=*x;*x=*y;*y=i;//利用指针做变量替换}float sum(int x,int y,int z)float i;i=(float)(x+y+z);return(i);}前几天也是帮同学做这样的题一模一样看来你也是WH大学

C语言编写按分数排序的函数

3,c语言快速排序qsort函数

你这个是c程序还是c++c++的话类型要求比较严格比较函数接受的参数类型应该是const void*c的话你main里函数原型的声明也不对啊,这样改一下#include<stdlib.h>#include<stdio.h>#include <ctype.h>int num[]=void main()int i,comp1(const void *i,const void *j),comp2(const void *i,const void *j);system("cls");/*清屏*/printf("the original array is:\n");for(i=0;i<10;i++)/*将数组按原序输出*/printf("%10d",num[i]);qsort(num,10,sizeof(int),comp1);printf("\n The accending sorted array is:\n");for(i=0;i<10;i++)/*将数组按升序输出*/printf("%10d",num[i]);qsort(num,10,sizeof(int),comp2);printf("\n The decending sorted array is:\n");for(i=0;i<10;i++)/*将数组按降序输出*/printf("%10d",num[i]);getchar();}comp1(const void *i,const void *j)return *(const int*)i-*(const int*)j;}comp2(const void *i,const void *j)return *(const int*)j-*(const int*)i;}
定义的comp1 和comp2改为int comp1 ( const void *i , const void *j ) return *(int *)i - *(int *)j; } int comp2 ( const void *i , const void *j ) return *(int *)j - *(int *)i; }
试想一下,如果让你自己设计qsort函数,需要些什么东西,首地址要有吧,总共有几个元素要有吧,每个元素占多大的内存要有吧(想想就知道函数内部要根据内存块的大小交换数据实现排序),最后一个规则总要有吧,qsort的灵活性在于规则是活的不是死的,其实大多数语言的排序都是类似的机制啦。。。看下qsort的原型void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));base就是所谓的首地址,nelem就是元素个数,width,就是每个元素的大小,fcmp是一个函数指针,这里函数的定义要类似于int cmp(const void*a,const void*b),其实很多人不知道怎么使用qsort主要是在于对这个函数不懂得如何写,其实想想就知道函数把每个元素的地址扔给比较函数,根据比较函数的返回值来决定到底是a在前面还是b在前面,所以在函数里面要先取出值,所以一般的写法就是int cmp(const void*a,const void*b)return *(t*)a-*(t*)b;}先强制转换成t类型再用取值符号*取出指,函数之所以用空指针是因为空指针可以指向任何类型,对于基本类型,只要将t修改为基本类型就行了,对于结构体之类的的指针,则return ((t*)a)->x-((t*)b)->x;其中t就是结构体的名称,x就是你要比较的字段,当然如果你要降序的话就将ab颠倒就行了,说了这么多,写一个例子,比如要对下面的数组排序int a[5]=qsort(a,5,sizeof(int),cmp);比较函数int cmp(const void*a,const void*b) return *(int*)a-*(int*)b;}。。呵呵,啰嗦了点。希望对你有帮助

c语言快速排序qsort函数

4,C语言 函数排序求解

我自己写了一个,你凑乎看一下吧void sort(double *p, int q) double *it1, *it2, *max; double tmp; for(it1 = p; it1 < (p+q); it1++) max = it1; for(it2 = it1+1; it2 < (p+q); it2++)//你原来的循环好像次数多了,从in+1开始就行 if(*it2 > *max) max = it2; } if(!(it1 == max)) tmp = *it1; *it1 = *max; *max = tmp; } }//这里没写输出,不过我觉得你把p用作遍历的中间变量, //后来p已经不是指向数组的首元素了}
一群菜鸟不懂的乱说。 我把楼主的代码改了一些,如下 #include<stdio.h> int input(int data[], int argc, int *n) int i; printf("请输入要输入数的个数"); scanf("%d", n); if(*n > argc) printf("segment fault!"); return -1; } for(i = 0; i < *n; i++) printf("输入的第%d个数.", i+1); scanf("%d", data+i); //canf("%d", &data[i]); } printf("输入的数是:\n"); for(i = 0; i < *n; i++) printf("%5d\n", data[i]); } return 0;} void sort(int n, int data[]) int i, j, temp; for(i = 0; i < n-1; i++) for(j = i+1; j < n; j++) if(data[i] < data[j]) temp = data[i]; data[i] = data[j]; data[j] = temp; } } printf("排序后的结果如下:\n"); for(i = 0; i < n; i++) printf("%5d\n", data[i]);} int main() int data[100]; int n; if(input(data, 100, &n) == -1) return -1; sort(n, data); return 0;} 对于以上代码,做出如下解释: (1)c语言的参数有形参和实参的说法,形参在传递到函数内的时候,复制一个副本给函数,在函数内部和外部是两个完全不同的变量,函数结束,空间也被释放,所以不能在函数内部来改变外部的值。所以要像楼主这样用一个函数给一个变量赋值,要用实参int input(int data[], int argc, int *n)中的int *n就是实现形式,这种办法把n的地址传递给函数。当然,在调用函数的时候也同样要传递地址指针类型(&n)。 (2) if(*n > argc) printf("segment fault!"); return -1; } 这一段是我加进去的,因为按照楼主的意思,data数组的长度也要传递进去,但是意思何在?所以只好加了这一段,并把函数改为有类型的,以检验是否有数据溢出。 (3)scanf("%d", data+i); //scanf("%d", &data[i]); 这里我改动的主要原因是为了提升程序速度,scanf("%d", &data[i]);同样可以运行,但是寻址一次,又回头要地址,这样绕了一圈,没有必要。 对于楼主提几点建议: (1)c语言的精髓在于指针,刚才说到的实参,就是用指针的概念实现的。scanf("%d", data+i); 一行,同样也是把数组头指针加上偏移地址,得到所要的地址。 (2)c语言编程的时候特别要注意数据的溢出,这是所有初学者头疼的问题之一。建议在一开始就养成习惯,经常检验数组的边界。 (3)void main一看就知道是看潭浩强的书长大的程序员。建议我们都用int main() (4)在做实际项目的时候,程序经常是要回头看的,也经常是要给别人看以达到维护的目的的。除了要养成良好的文档书写习惯以外(学习软件工程以后你就会掌握),还要养成良好的编程风格,这里我建议看《thinking in c++》,并按照里面例题的风格,养成自己的习惯。
冒泡排序的方法:#includevoid sort(double *p,int n) { int i,j;int flag=1;//flag 减少程序运行的次数,也可以不用 double temp; for(i=1;i { flag=0; for(j=0,p;j if((*p)>*(p+1)) { temp=*p; *p=*(p+1); *(p+1)=temp; } } } void main() { double s[7]={1,5,4,9,6,7,8 }; int i; printf("排序前:\n"); for(i=0;i<7;i++) printf("%3.1f ",s[i]); printf("\n\n"); double *p=s; sort (p,7); printf("排序后:\n"); for(i=0;i<7;i++) printf("%3.1f ",s[i]); printf("\n\n"); }
文章TAG:c语言语言排序函数c语言排序函数

最近更新