qsort用法(转)

来源:互联网 发布:小米air 装linux 编辑:程序博客网 时间:2024/06/09 11:34

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );



base是需要sort的数组,num是base的大小,width是每个元素的大小,以byte为单位,compare是一个比较大小的函数的指针,当然是你自己写的了,因为qsort也不知道你要排序的是什么东西啊,你就告诉它是elem1大呢还是elem2大就行了,返回值看看下面的详细文档啦。



The qsort function implements a quick-sort algorithm to sort an array of num elements, each of width bytes. The argument base is a pointer to the base of the array to be sorted. qsort overwrites this array with the sorted elements. The argument compare is a pointer to a user-supplied routine that compares two array elements and returns a value specifying their relationship. qsort calls the compare routine one or more times during the sort, passing pointers to two array elements on each call:



compare( (void *) elem1, (void *) elem2 );



The routine must compare the elements, then return one of the following values:



Return Value Description

< 0 elem1 less than elem2

0 elem1 equivalent to elem2

> 0 elem1 greater than elem2





The array is sorted in increasing order, as defined by the comparison function. To sort an array in decreasing order, reverse the sense of “greater than” and “less than” in the comparison function.



Example

/* QSORT.C: This program reads the command-line

* parameters and uses qsort to sort them. It

* then displays the sorted arguments.

*/



#include <stdlib.h>

#include <string.h>

#include <stdio.h>



int compare( const void *arg1, const void *arg2 );



void main( int argc, char **argv )

{

    int i;

    /* Eliminate argv[0] from sort: */

    argv++;

    argc--;



    /* Sort remaining args using Quicksort algorithm: */

    qsort( (void *)argv, (size_t)argc, sizeof( char * ), compare );



    /* Output sorted list: */

    for( i = 0; i < argc; ++i )

       printf( "%s ", argv[i] );

    printf( "/n" );

}



int compare( const void *arg1, const void *arg2 )

{

    /* Compare all of both strings: */

    return _stricmp( * ( char** ) arg1, * ( char** ) arg2 );

}



Output

[C:/code]qsort every good boy deserves favor

boy deserves every favor good

///////////////////////////////////////////////////////////////////////////////////////////////////////

七种qsort排序方法

<本文中排序都是采用的从小到大排序>

一、对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);

七、计算几何中求凸包的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;
}

PS:

其中的qsort函数包含在<stdlib.h>的头文件里,strcmp包含在<string.h>的头文件里

//////////////////////////////////////////////////////////////////////////////////////////////////

利用qsort() 对字符串的内容快速排序

#include "stdafx.h"
/* QSORT.C: This program reads the command-line
* parameters and uses qsort to sort them. It
* then displays the sorted arguments.
*/

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int compare( const void *arg1, const void *arg2 );

void main( int argc, char **argv )
{
  
    char a[255]="1723649/0";
    int k=strlen(a);
   
    qsort((void *)a,(size_t)strlen(a),sizeof(char),compare);
    printf   ("%s",a);
}

int compare( const void *arg1, const void *arg2 )
{
return -(((char *)arg1)[0]-((char*)arg2)[0]);//降序,这个值取负则为升序
}

///////////////////////////////////////////////////////////////////////////////////////////
(示例)使用快速排序函数qsort的例程

函数名: qsort
功   能: 使用快速排序例程进行排序
用   法: void qsort(void *base, int nelem, int width, int (*fcmp)());
程序例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int sort_function( const void *a, const void *b);

char list[5][4] = { "cat", "car", "cab", "cap", "can" };
  

int main(void)
{
    int   x;

    qsort((void *)list, 5, sizeof(list[0]), sort_function);
    for (x = 0; x < 5; x++)
       printf("%s/n", list[x]);
    return 0;
}

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

原创粉丝点击