① c语言中排序方法
1、冒泡排序(最常用)
冒泡排序是最简单的排序方法:原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。(注意每一轮都是从a[0]开始比较的)
以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。
2、鸡尾酒排序
鸡尾酒排序又称双向冒泡排序、鸡尾酒搅拌排序、搅拌排序、涟漪排序、来回排序或快乐小时排序, 是冒泡排序的一种变形。该算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。
原理:数组中的数字本是无规律的排放,先找到最小的数字,把他放到第一位,然后找到最大的数字放到最后一位。然后再找到第二小的数字放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。
3、选择排序
思路是设有10个元素a[1]-a[10],将a[1]与a[2]-a[10]比较,若a[1]比a[2]-a[10]都小,则不进行交换。若a[2]-a[10]中有一个以上比a[1]小,则将其中最大的一个与a[1]交换,此时a[1]就存放了10个数中最小的一个。同理,第二轮拿a[2]与a[3]-a[10]比较,a[2]存放a[2]-a[10]中最小的数,以此类推。
4、插入排序
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素*
一般来说,插入排序都采用in-place在数组上实现。
具体算法描述如下:
⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2~5
② 用C语言如何对大量数字进行排序
如果是C语言的话只能手写堆排序、归并排序或者快速排序等等
如果是用C++的话可以看下面:
10W量级直接考虑使用STL的sort函数,用法自行网络或者参见http://www.cplusplus.com/reference/algorithm/sort/
sort函数默认是升序排序,要降序排序可以传cmp函数过去或者sort完了reverse
1000W量级考虑使用计数排序或者基数排序,这两种排序对被排序数字的大小有一定限制
如果是1000W量级的实数排序,或者数字可能很大的话,那么还是回到之前说的sort
STL里提供了很多O(nlogn)级别的排序函数,比如sort、qsort、stable_sort
另外还有简化归并排序代码用的merge函数等等
以上所有函数均能在cplusplus.com查到详细用法
③ C语言qsort 对于malloc分配的二维数组 cmp函数怎么写,求大神赐教!!
看起来你真的晕了。
先明确问题,你打算操作一个数组,数组的每个元素是一个指针,指向2个元素的数组。元素的大小关系为先比较第一个元素,第一个元素相同比较第二个元素。
如果这是样,你的分配代码就错了。
int
*b,**a;
a
=
(int**)malloc(500000*sizeof(int*));
//这里应是对int*来分配。
for(i=0;i<500000;i++)
{
b
=
malloc(2*sizeof(int));
a[i]
=
b;
}
qsort的调用是对。
cmp的写法有问题,入参实际是数组元素的指针,这里元素是int*,入参应该是int**,而你要比较的数组,这个指针指向的内容。
int
cmp(const
void*
a,const
void*
b)
{
int
*ap
=
*(int**)a;
int
*bp
=
*(int**)b;
if(ap[0]
==
bp[0])
return
ap[1]
-
bp[1];
else
return
a[0]
-
b[0];
}
④ c语言中strcmp函数的cmp是什么单词的缩写
1、cmp 是 compare,比较的缩写。
2、strcmp是C语言中头文件<string.h>(字符串函数)中定义的一个用于对两组字符串进行比较的函数,它的返回值是int类型。
假设有两组字符串cs和ct,当cs<ct时,函数返回一个负数;当cs==ct时,函数返回0;当cs>ct时,函数返回一个正数。
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。如:"A"<"B" ,"a">"A" ,"computer">"compare" ,"comput">"comp"
strcmp函数原型为:int strcmp(const char *s1,const char * s2);
⑤ 如何用c语言将许多个整数变成字符串并比较它们的大小,将其按照降序排列
可以先将这些整数放进一个数组里
然后将它们进行逆序排序
再将它们转换成字符串存入到一个字符串数组里
一个简单的代码如下
#include<stdio.h>
#include<stdlib.h>
#defineMAX_NUM20
#defineNUMsizeof(a)/sizeof(int)
voidint_to_str(int*a,chars[][MAX_NUM],intn)
{
inti;
for(i=0;i<n;++i)
snprintf(s[i],MAX_NUM,"%d",a[i]);
}
intcmp(constvoid*a,constvoid*b)
{
int*x=(int*)a;
int*y=(int*)b;
return*x<*y?1:0;
}
intmain(intargc,char**argv)
{
inta[]={1,5,9,8,6,4,3,7,2,0};
chars[NUM][MAX_NUM];
inti;
for(i=0;i<NUM;++i)
printf("%d",a[i]);
printf(" ");
//排序
qsort(a,NUM,sizeof(int*),cmp);
for(i=0;i<NUM;++i)
printf("%d",a[i]);
printf(" ");
//转换
int_to_str(a,s,NUM);
for(i=0;i<NUM;++i)
printf("%s",s[i]);
printf(" ");
return0;
}
自然的也可以转换后再排序
代码如下
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#defineMAX_NUM20
#defineNUMsizeof(a)/sizeof(int)
voidint_to_str(int*a,chars[][MAX_NUM],intn)
{
inti;
for(i=0;i<n;++i)
snprintf(s[i],MAX_NUM,"%d",a[i]);
}
intcmp(constvoid*a,constvoid*b)
{
returnstrcmp((char*)a,(char*)b)>0?0:1;
}
intmain(intargc,char**argv)
{
inta[]={1,5,9,8,6,4,3,7,2,0};
chars[NUM][MAX_NUM];
inti;
//转换
int_to_str(a,s,NUM);
//排序
qsort(s,NUM,sizeof(char)*MAX_NUM,cmp);
for(i=0;i<NUM;++i)
printf("%s",s[i]);
printf(" ");
return0;
}
⑥ c语言输入n个数 ,然后奇数按照升序排列,偶数按降序排列
由于n不确定,故选择链表存储输入数据,这里选用一个无头结点的链表。编写创建链表、释放链表、排序三个函数,在主函数中调用这些函数来完成。代码如下:
//#include"stdafx.h"//Ifthevc++6.0,withthisline.
#include"stdio.h"
#include"stdlib.h"
typedefstructnode{
intn;
structnode*next;
}*NODE,node;
voidfreenode(NODEp){//释放链表
if(p->next)freenode(p->next);
free(p);
}
NODECreateLink(void){//创建链表
intx;
NODEhead,p;
if((p=head=(NODE)malloc(sizeof(node)))==NULL){//创建头结点
printf("Establishaheadnodefailure...");
returnNULL;
}
printf("Inputsomedata(non-numericend)... ");
while(scanf("%d",&x)==1){
if((p->next=(NODE)malloc(sizeof(node)))==NULL){
printf("Failedtocreatenode...");
freenode(head);
returnNULL;
}
p->next->n=x;
p=p->next;
}
p->next=NULL;
p=head;//删除头结点
head=head->next;
free(p);
returnhead;
}
voidmysort(NODEp){//奇数升排偶数降排
NODEp1,p2;
for(;p;p=p->next){
for(p1=p,p2=p1->next;p2;p2=p2->next)
if(p->n&1&&p2->n&1&&p1->n>p2->n)
p1=p2;
elseif(!(p->n&1)&&!(p2->n&1)&&p1->n<p2->n)
p1=p2;
if(p1!=p){
p1->n^=p->n;
p->n^=p1->n;
p1->n^=p->n;
}
}
}
intmain(void){
NODEhead=CreateLink(),p;
mysort(head);//按要求排序
for(p=head;p;p=p->next)//打出来看看
printf("%d",p->n);
freenode(head);
printf(" ");
return0;
}
⑦ 如何用C语言排序
试想一下,如果让你自己设计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]={2,10,5,4,0};
qsort(a,5,sizeof(int),cmp);
比较函数
int
cmp(const
void*a,const
void*b)
{
return
*(int*)a-*(int*)b;
}
。。呵呵,啰嗦了点。希望对你有帮助
⑧ C语言中对结构体qsort cmp函数怎么写
int cmp(struct data v1,struct data v2)
{
if(v1.cnt > v2.cnt) return 1;
else if(v1.cnt < v2.cnt) return -1;
else return strcmp(v1.w,v2.w);
}
⑨ c语言中合并两个降序数组,使合并后的数组仍然保持降序排列
#include<stdio.h>
#include<stdlib.h>
#define N 100
int cmp(const void*a,const void*b)
{//快速排序比较函数
int *x=(int*)a;
int *y=(int*)b;
return *y-*x;
}
int main()
{
int a[N]={9,7,5,3,1};
int b[N]={8,6,4,2,0};
int sum[2*N]={0};//合并数组
int k=0;//合并数组元素个数的计数
for(int i=0;i<5;i++)
{
sum[k++]=a[i];//a数组元素赋值给sum数组
}
for(int i=0;i<5;i++)
{
sum[k++]=b[i];//b数组元素赋值给sum数组
}
qsort(sum,10,sizeof(sum[0]),cmp);//降序排序
for(int i=0;i<k;i++)//输出
printf("%d ",sum[i]);
return 0;
}