STL中qsort的七种用法

qsort()  应该就是用的快排。貌似是以数据块的方式移动数据,速度较快。

原型:
_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*));

解释:    qsort ( 数组名 ,元素个数,元素占用的空间(sizeof),比较函数)
比较函数是一个自己写的函数  遵循 int com(const void *a,const void *b) 的格式。
当a b关系为 >  <  = 时,分别返回正值 负值 零 (或者相反)。
使用a b 时要强制转换类型,从void * 转换回应有的类型后,进行操作。
数组下标从零开始,个数为N, 下标0-(n-1)。

示例:
int nn[100],n=100;
int com(const void *a,const void *b)
{
    return *(int*)a-*(int*)b;
}   

qsort((void *)nn,n,sizeof(int),com);
相关:
为什麽你必须给予元素个数?(因为阵列不知道它自己有多少个元素)为什麽你必须给予 double 的大小?(因为 qsort 不知道它要排序的单位是 doubles.)为什麽你必须写那个丑陋的、用来比较 doubles 数值的函式?(因为 qsort 需要一个指标指向某个函式,因为它不知道它所要排序的元素型别)为什麽 qsort 所使用的比较函式接受的是 const void* 引数而不是 char* 引数?(因为 qsort 可以对非字串的数值排序)Bjarne Stroustrup

 

 

一、对int类型数组排序
int num[100];
Sample:
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
qsort(num,100,sizeof(num[0]),cmp);

二、对char类型数组排序(同int类型)
char word[100];
Sample:
int cmp( const void *a , const void *b )
{
return *(char *)a - *(int *)b;
}
qsort(word,100,sizeof(word[0]),cmp);

三、对double类型数组排序(特别要注意)
double in[100];
int cmp( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? 1 : -1;
}
qsort(in,100,sizeof(in[0]),cmp);

四、对结构体一级排序
struct In
{
double data;
int other;
}s[100]
//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写
int cmp( const void *a ,const void *b)
{
return (*(In *)a)->data > (*(In *)b)->data ? 1 : -1;
}
qsort(s,100,sizeof(s[0]),cmp);

五、对结构体二级排序
struct In
{
int x;
int y;
}s[100];
//按照x从小到大排序,当x相等时按照y从大到小排序
int cmp( const void *a , const void *b )
{
struct In *c = (In *)a;
struct In *d = (In *)b;
if(c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}
qsort(s,100,sizeof(s[0]),cmp);

六、对字符串进行排序
struct In
{
int data;
char str[100];
}s[100];
//按照结构体中字符串str的字典顺序排序
int cmp ( const void *a , const void *b )
{
return strcmp( (*(In *)a)->str , (*(In *)b)->str );
}
qsort(s,100,sizeof(s[0]),cmp);

自己写一个纯字符串的:(temp是二维的字符串数组,j是一共需排序的字符串个数)

int cmpstr(const void *a,const void *b)
{
   return strcmp((char*)a,(char*)b);
}

    qsort(temp, j,sizeof(temp[0]),cmpstr);

七、计算几何中求凸包的cmp
int cmp(const void *a,const void *b) //重点cmp函数,把除了1点外的所有点,旋转角度排序
{
struct point *c=(point *)a;
struct point *d=(point *)b;
if( calc(*c,*d,p[1]) < 0) return 1;
else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) //如果在一条直线上,则把远的放在前面
return 1;
else return -1;
}

qsort()是c程序库stdlib.h中的一个函数,需要比较函数完成排序;
sort()是STL中的标准算法
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
    return *((int *)b)-*((int *)a);
}
    .
    .
     .
qsort(q,n,sizeof(int),cmp);
    .
    .
    .
}
qsort对一维数组和字符串数组的排序:
#include "stdio.h"
#include "stdlib.h"
int a[100];
int cmp(const void *p,const void *q)
{
    return (*(int*)p)-*((int*)q);
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    qsort((void*)a,n,sizeof(a[0]),cmp);
    for(int i=0;i<n;i++)
      printf("%d\n",a[i]);
    //while(1);
    
int cmp(const void *p,const void *q)
{
    return strcmp((char*)p,(char*)q);
}
int main()return 0;
}

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
char a[20005][25];
{
    int n,m,i,j;
    while(1)
    {
            scanf("%d%d",&n,&m);
            if(n==0&&m==0) break;
            for(i=0;i<n;i++)
            {
               scanf("%s",a[i]);
            }
            qsort((void*)a,n,sizeof(a[0]),cmp);
            for(i=0;i<n;i++)
               printf("%s\n",a[i]);
    }
}

 

时间: 2024-10-27 17:41:59

STL中qsort的七种用法的相关文章

Javascript中call的两种用法实例

 这篇文章主要介绍了Javascript中call的两种用法实例,有需要的朋友可以参考一下 用法一(常见用法):   表现形式为:一个对象.方法.call(另一个对象),意义是用另一个对象代替当前对象,执行当前对象的方法.先看示例:  代码如下: function Class1(){     this.name = "class1";     this.showName = function(){         alert(this.name);     } } function C

js中继承的几种用法总结

 本篇文章主要介绍了js中继承的几种用法总结(apply,call,prototype) 需要的朋友可以过来参考下,希望对大家有所帮助 一,js中对象继承   js中有三种继承方式   1.js原型(prototype)实现继承   代码如下: <SPAN style="BACKGROUND-COLOR: #ffffff"><SPAN style="FONT-SIZE: 18px"><html>   <body>  

jQuery中animate的几种用法与注意事项_jquery

一.animate语法结构 animate(params,speed,callback) params:一个包含样式属性及值的映射,比如{key1:value1,key2:value2} speed:速度参数[可选] callback:在动画完成时执行的函数[可选] 二.自定义简单动画 用一个简单例子来说明,实现单击某div在页面上横向飘动的效果. <style> #cube{ position:relative;/* 不加这句元素不能动 */ width:30px; height:30px;

Javascript中call的两种用法实例_javascript技巧

用法一(常见用法): 表现形式为:一个对象.方法.call(另一个对象),意义是用另一个对象代替当前对象,执行当前对象的方法.先看示例: 复制代码 代码如下: function Class1(){    this.name = "class1";    this.showName = function(){        alert(this.name);    }}function Class2(){    this.name = "class2";}var c1

javascript中this的四种用法_javascript技巧

this 在函数执行时,this 总是指向调用该函数的对象.要判断 this 的指向,其实就是判断 this 所在的函数属于谁. 在<javaScript语言精粹>这本书中,把 this 出现的场景分为四类,简单的说就是: 有对象就指向调用对象 没调用对象就指向全局对象 用new构造就指向新对象 通过 apply 或 call 或 bind 来改变 this 的所指. 1) 函数有所属对象时:指向所属对象 函数有所属对象时,通常通过 . 表达式调用,这时 this 自然指向所属对象.比如下面的

详解Java中super的几种用法并与this的区别_java

1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位 复制代码 代码如下: class Base { Base() { System.out.println("Base"); } } public class Checket extends Base { Checket() { super();//调用父类的构造方法,一定要放在方法的首个语句 System.out.println("Checket"); }   public static v

C#中using的三种用法

using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型. 为命名空间创建别名. using 关键字还用来创建 using 语句  定义一个范围,将在此范围之外释放一个或多个对象. 请参见 using 语句.http://www.yaosansi.com/blog/article.asp?id=669   using namespace;using alias = type|namespace; 参数 Alias 您希望用来表示命名空间或类型的用户定义符号.

js中继承的几种用法总结(apply,call,prototype)_javascript技巧

一,js中对象继承 js中有三种继承方式 1.js原型(prototype)实现继承 复制代码 代码如下: <SPAN style="BACKGROUND-COLOR: #ffffff"><SPAN style="FONT-SIZE: 18px"><html>  <body>  <script type="text/javascript">      function Person(na

软件测试中单元测试的七种境界

对于PHP来说,很少有人用到单元测试,毕竟PHP的调试确实很方便 . 但近年来,随着PHP越来越深入于做企业应用,因此对于单元测试的要求也就越来越被人 放到台前.PHPUNIT都3.0了,想想看发展了多久了. 这是向东的博客上的一篇文章,不知道对各位有没有用,我是先复制下来看看. 1.以各种借口拒绝单元测试Unit Test,比较常用的是"你没有足够的时间(进行单 元测试)". 2.尝试单元测试并且立刻开始在自己的博客商鼓吹单元测试和测试驱动开发Test Driven Developm