c语言qsort函数 qsort qsort-qsort函数简介,qsort-c函数qsort()和bsearch()的用

qsort的功能是使用快速排序例程进行排序。

qsort_qsort -qsort函数简介

功 能: 使用快速排序例程进行排序
用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序

qsort_qsort -c函数qsort()和bsearch()的用法

使用qsort()排序 并 用 bsearch()搜索是一个比较常用的组合,使用方便快捷。
qsort 的函数原型是void __cdecl qsort ( void *base,size_tnum, size_t width, int (__cdecl *comp)(const void *, const void* ) )
其中base是排序的一个集合数组,num是这个数组元素的个数,width是一个元素的大小,comp是一个比较函数。
比如:对一个长为1000的数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。
qsort(a,1000,sizeof(int ),comp);
其中comp函数应写为:
int comp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
上面是由小到大排序,return *(int *)b-*(int *)a; 为由大到小排序。
是对一个二维数组的进行排序:
int a[1000][2]; 其中按照a[0]的大小进行一个整体的排序,其中a[1]必须和a[0]一起移动交换。
qsort(a,1000,sizeof(int)*2,comp);
int comp(const void *a,const void *b)
{
return ((int *)a)[0]-((int *)b)[0];
}

qsort_qsort -举例

举例1:对结构体排序

char a[1000][20];
qsort(a,1000,sizeof(char)*20,comp);
int comp(const void *a,const void *b )
{
return strcmp((char *)a,(char *)b);
}
对一个结构体进行排序:
typedef struct str
{
char str1[11];
char str2[11];
}str,*stri;
str strin[100001]=;
int compare(const void *a,const void *b)
{
return strcmp( ((str*)a)->str2 , ((str*)b)->str2 );
}
qsort(strin,total,sizeof(str),compare);
#include
using namespace std;
#include <stdlib.h>
#include
int compare( const void *a, const void *b);
char * list[5]= {"cat","car","cab","cap","can"};
int main()

举例2:(C/C++例程)

按字符串长度对字符串进行排序:
#include
#include
#include
#define N 8
using namespace std;
int compare(const void *a,const void *b);
int main(void)
{
int i;
char s[8][10]={"January","February","March","April","May","June","July","September"};
qsort(s,8,sizeof(char)*10,compare);
for(i=0;i<8;i++)
cout<<
return 0;
}
int compare(const void *a,const void *b)
{
if(strlen((char *)a)!=strlen((char *)b))
return strlen((char *)a)-strlen((char*)b);
return (strcmp((char *)a,(char *)b));
}
下面这个例程在VS2008中运行通过,比较具有代表性:
#include
#include
#include
int compare(const void *arg1,const void *arg2);
int main(int argc,char **argv)
{
int i;
argv++;
argc--;
qsort((void *)argv,(size_t)argc,sizeof(char *),compare);
for(i=0;i
printf("%sn",argv);
return 0;
}
int compare(const void *arg1,const void *arg2)
{
return _stricmp(*(char **)arg1,*(char **)arg2);
}
在运行输入cmd,在qsort.exe 参数1 参数2将会排序。

举例3:pascal 例程

program quicksort;
const
max = 100000;
max = 1000;
type
tlist = array[1..max] of longint;
var
data : tlist;
i : longint;
procedure qsort(var a : tlist);
procedure sort(l,r: longint);
var i,j,x,y: longint;
begin
i:=l; j:=r;
x:=a[(l+r) div 2];
repeat
while a[i]
while x
if i<=j then
begin
y:=a[i];a[i]:=a[j];a[j]:=y;
inc(i);dec(j);
end;
until i>j;
if l
if i
end;
begin
sort(1,max);
end;
begin
write('Creating ',Max,' random numbers between 1 and 500000');
randomize;
for i:=1 to max do
data:=random(500000);
writeln;
writeln('Sorting...');
qsort(data);
writeln;
for i:=1 to max do
begin
write(data:7);
if (i mod 10)=0 then
writeln;
end;
end.
下面讲解下Pascal的快排代码
program kuaipai;
var
save:array[-1..10000000]of longint;//保存数字的数组
n,i:longint;
procedure qsort(x,y:longint);
var
a,b,c,em,d,mid,e,i,j,k,l:longint;
begin
i:=x;//i代表第一个数字的数组坐标,下面叫“左指针”
j:=y;//j代表第二个数字的数组坐标 叫"右指针"
mid:=save[(x+y)div 2];//取,这2个数字中间的数组坐标(二分)
repeat
while save[i]
while save[j]>mid do dec(j);//在中间数右边,找比中间数小的数字
if i<=j//如果左指针在右指针左边
then begin
em:=save[i];//交换2个数字的值,这个你会冒泡排序,或者选择排序任意一个,应该明白
save[i]:=save[j];
save[j]:=em;
inc(i);
dec(j);
end;
until i>j;//左指针跑到右指针右边了。。。
if i
if j>x then qsort(x,j);//如果右指针没跑到,左界限,那么从右指针到左界限排序
end;
begin
randomize;//优化程序用的,暂时你不用会
readln(n);//读入,表示有N个数字
for i:=1 to n do//读入这N个数字
read(save[i]);
qsort(1,n);//从第一个数字,到最后一个数字排序
for i:=1 to n do//输出
write(save[i],' ');
end.

举例4:对整型和Double型排序

c语言qsort函数 qsort qsort-qsort函数简介,qsort-c函数qsort()和bsearch()的用
一个典型的qsort的写法如下qsort(s,n,sizeof(s[0]),cmp);
其中第一个参数是参与排序的数组名(或者也可以理解成开始排序的地址,因为可以写&s[i]这样的表达式);
第二个参数是参与排序的元素个数;
第三个参数是单个元素的大小,推荐使用sizeof(s[0])这样的表达式;
第四个参数就是让很多人觉得非常困惑的比较函数啦,关于这个函数,还要说的比较麻烦...
我们来讨论cmp这个比较函数(写成cmp是我的个人喜好,你可以随便写成什么,比如qcmp什么的).典型的cmp的定义是int cmp(const void *a,const void *b);
返回值必须是int,两个参数的类型必须都是const void *,那个a,b是我随便写的,个人喜好.
假设是对int排序的话,如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回
0,其他的依次类推,后面有例子来说明对不同的类型如何进行排序.
下面举例:
No.2.最常见的,对int数组排序
#include
#include
#include
int s[10000],n,i;
int cmp(const void *a, const void *b)
{
return(*(int *)a-*(int *)b);
}
int main()
{
scanf("%d",&n);
for(i=0;i
scanf("%d",&s[i]);
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i
printf("%d ",s[i]);
return(0);
}
No.3.对double型数组排序,原理同int这里做个注释,本来是因为要判断如果a==b返回0的,但是严格来说,两个double数是不可能相等的,只能说fabs(a-b)<1e-20之类的这样来判断,所以这里只返回了1和-1
#include
#include
double s[1000];
int i,n;
int cmp(const void * a, const void * b)
{
return((*(double*)a-*(double*)b>0)?1:-1);
}
int main()
{
scanf("%d",&n);
for(i=0;i
scanf("%lf",&s[i]);
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i
printf("%lf ",s[i]);
return(0);
}

qsort_qsort -qsort图

;i++)>;i++)>;i++)>;i++)>[j]>;++i)>;>[i]>

  

爱华网本文地址 » http://www.aihuau.com/a/8103590103/146626.html

更多阅读

MsgBox函数和MsgBox语句 msgbox函数使用范例

MsgBox函数和MsgBox语句均可用来弹出对话框,不同处在于MsgBox函数可以返回一个值,而MsgBox语句不会返回值。MsgBox语句:用于弹出一个对话框。格式如下:MsgBox内容[,类型][,标题][,帮助文件名,帮助主题目录号]在IE地址栏中输入“javascri

抽象函数定义域的求解方法 抽象函数的定义域

函数定义域的求解有对具体函数求定义域和对抽象函数求定义域,对具体函数来说比较简单,学生易于掌握和理解,而抽象函数则相对困难一些。例如:(1)已知函数f(x)的定义域是[1,3],求函数f(2x+1)的定义域。(2)已知函数f(2x+1)的定义域是[1,3],求函数

c语言函数的调用方法 c语言函数的调用

欢迎加入编程爱好者QQ群群号57616770中都只有一个主函数main(),但实用程序往往由多个函数组成。函数是C源程序的基本模块,通过对函数模块的调在第一章中已经介绍过,C源程序是由函数组成的。虽然在前面各章的程序用实现特定的功能。C语言

Excel知识点四 :Left函数、Mid函数和Date函数

Excel知识点(四):Left函数、Mid函数和Date函数一、Left函数:1、残疾证一共20位,是在身份证后面加2位数字。2、想从20位的残疾证中提取前面的18位,作为身份证号,无须手动,用Left函数。3、Left函数的格式是:LEFT(E2,18)

函数是因变量吗 因变量 因变量-函数中的因变量

因变量(dependent variable),函数中的专业名词,函数关系式中,某些特定的数会随另一个(或另几个)会变动的数的变动而变动,就称为因变量。如:Y=f(X),此式表示为:Y随X的变化而变化,Y是因变量,X是自变量。对于函数中的自变量和因变量有时是相互的,即变

声明:《c语言qsort函数 qsort qsort-qsort函数简介,qsort-c函数qsort()和bsearch()的用》为网友哏颩蓅蒗分享!如侵犯到您的合法权益请联系我们删除