c语言排序函数
⑴ c语言排序函数与显示函数的联系
你思路就有问题,排序完没有写入文件
present()读取的还是没排序之前的数据
⑵ c语言数组用sort函数排序
#include<stdio.h>
#include<algorithm>
main(){
int a[10]={10,9,8,7,6,5,4,3,2,1};
std::sort(a,a+10);
for(int i=0;i<10;i++)
printf("%d\t",a[i]);}
⑶ C语言 排序 函数
一群菜鸟不懂的乱说。 我把楼主的代码改了一些,如下 #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(){ return 0; }的形式,可以看看C语言之父K&R的书。主函数的返回值是告诉操作系统,这个函数是正常退出(返回0),还是异常退出(非0,经常是-1)。(4)在做实际项目的时候,程序经常是要回头看的,也经常是要给别人看以达到维护的目的的。除了要养成良好的文档书写习惯以外(学习软件工程以后你就会掌握),还要养成良好的编程风格,这里我建议看《thinking in C++》,并按照里面例题的风格,养成自己的习惯。
⑷ C语言字符串快速排序函数
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedefcharstrLINE[2000];
intstrCMP(constvoid*a,constvoid*b)
{
returnstrcmp((constchar*)a,(constchar*)b);
}
intmain(intargc,char*argv[])
{
strLINE*p;
inti,n;
scanf("%d",&n);
p=malloc(sizeof(strLINE)*n);
for(i=0;i<n;i++)scanf("%s",p[i]);
qsort(p,n,sizeof(strLINE),strCMP);
for(i=0;i<n;i++)printf("%s ",p[i]);
free(p);
return0;
}
⑸ C语言编写一个函数排序调用
#include<stdio.h>
voidsortP(intp[])
{
inti,k;
int*fir; //首位数的指针
int*cur; //当前数的指针
int*max; //最大数的指针
inttmp; //交换数字的临时变量
fir=p;
for(i=0;i<9;i++) //10个数字,从0--9
{
max=fir; //最大值默认为第一个
cur=fir+1; //从第二个数字开始比较
for(k=i;k<10;k++) //一直到最后一个
{
if(*cur>*max)max=cur; //把最大数值的指针保存到max指针
cur++; //下一个数字
}
tmp=*fir; //把最大数字和首位的数字交换,
*fir=*max;
*max=tmp;
fir++; //比较下一个数字
}
}
intmain(void)
{
inta[10],*p;
inti;
p=a; //把指针指向数组首位
printf("请输入10个整数:");
for(i=0;i<10;i++)
{
scanf("%d",p);
p++;
}
printf(" 排序后的10个数字是: ");
p=a; //重新把指针指向数组首位
sortP(p);
for(i=0;i<10;i++)
{
printf("%d",*p);
p++;
}
printf(" ");
return0;
}
⑹ c语言怎么用自定义函数排序
用冒泡排序法,代码如下:for(j=0;j<=9;j++)
//10人的总成绩进行排序
{
for
(i=0;i<10-j;i++)
if
(a[i]>a[i+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;}
}
for(i=0;i<10;i++)
//打印排序后的总分{printf("%5d",a[i]);}
⑺ C语言排序函数看不懂,求教!
t=i 这句有误,应为p=i。
这是选择排序法。p就是循环进行到当前为止,全场最小数组元素的下标值。
比如 数组a[3],有三个元素,4 3 2
第一次,j=0,a[0]=4,p一开始为0,指向a[0]。将a[1]与a[0]比,发现a[1]更小,于是令p为1,指向a[1]。再将a[2]与a[1]比,a[2]还要小,于是令p为2,指向a[2]。如果后面还有,就继续下去,p永远是当前发现的最小的元素的下标。 等进行到末尾,将a[p],即这圈下来发现的最小元素,和a[0]对调。于是a[0]现在是全数组最小的元素。
第二次,a[0]可以不用管了,从a[1]开始重复上面的过程。同理,最后a[1]是剩下的数里最小的,也就是全数组第二小的元素。
第三次....
⑻ C语言中的排序函数是什么
include <cstdlib> 或 #include <stdlib.h>
qsort(void* base, size_t num, size_t width, int(*)compare(const void* elem1, const void* elem2))
参数表
*base: 待排序的元素(数组,下标0起)。
num: 元素的数量。
width: 每个元素的内存空间大小(以字节为单位)。可用sizeof()测得。
int(*)compare: 指向一个比较函数。*elem1 *elem2: 指向待比较的数据。
比较函数的返回值
返回值是int类型,确定elem1与elem2的相对位置。
elem1在elem2右侧返回正数,elem1在elem2左侧返回负数。
控制返回值可以确定升序/降序。
产生随机数的函数也是rand(),不是rank().
⑼ c语言 排序函数
首先这是一种快速排序的算法,你也应该知道,快速排序就是选择序列中的一个元素作为基准,通过循环找到这个基准最终的位置,并把所有小于这个基准的元素移到这个位置的左边,大于基本的元素移到右边,这样再对这个基准的左右两边分别递归调用自己,最终就能得到排序的结果。
再来解释一下这个例子,它选择的基准就是v[(left+right)/2],然后将这个基准雨v[left]交换,现在假设你想从头排序到最后,则你会将left传个0,也就是他将这个基准和V[0]交换了,这个时候开始循环,因为第一个元素是基准,所以从第二个元素开始循环(也就是left+1),然后到if判断部分,如果v[i]<v[left],也就是说这个时候已经至少有一个元素比基准小了,所以基准至少在v[1]或者之后了,所以他把你找到的这个比基准小的v[i]和v[++last]交换,这时候v[i]的位置已经是在基准的正确位置或者之前了,不会在基准之后的,所以这就实现了把比基准小的元素移到基准的正确位置之前,你说的【第一遍执行过程中,第8行last=left=0,那么到了11行时相当于交换v[1]和v[0+1]】这没有错,确实是在自己交换自己,但是这样并不违背前面的思路不是么?当if条件不满足的时候,last是不会增加的,但是i会一直加1,所以last和i就会不同,这只是在将比基准小的元素移到基准之前,每有一个比基准小的,last就加1,这样当你循环一遍之后的last值就是基准应该在的位置,而且这个时候,所有比基本小的元素也都在last之前了,这时候last位置的元素也是比基准小的,这没关系,因为之后还有一句swap[v,last,left],到目前位置,基准的位置找到了,基准左边的元素都比基准小,右边都比基准大,再对基准的左右两边递归调用自己,就完成了序列的排序。
⑽ c语言的排序函数
#include"stdio.h"
int main(void)
{
int a[10];
int i,j,n,temp;
printf("please input the num of the number:");
scanf("%d",&n);
printf("请输入%d个整数:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]>a[j])
{
temp=a[i];a[i]=a[j];a[j]=temp;
}
printf("after sorted:\n");
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
你也不说清楚点,这是我写过的一个函数,你参考一下吧