快速排序qsort和sort的用法

1、用qsort必须先包含<iostream>或者<stdlib>

    (1)使用模型

         以下是对10个整形数从小到大排序的实例

view plaincopy to clipboardprint?
#include <iostream>   
using namespace std;  
 
int cmp( const void *a, const void *b )  
{  
    int *c = (int *)a;  
    int *d = (int *)b;  
    return *c - *d;  
}  
 
int main()  
{  
    int i, a[10]={10,9,8,7,6,5,4,3,2,1};  
    qsort(a, 10, sizeof(a[0]), cmp);  
    for( i=0; i<10; ++i )  
        cout <<a[i] <<" ";  
 
    return 0;  
}   

 说明:cmp函数中return *c - *d 改为return *d - *c,则qsort功能变为对10个数从大到小排序,所以cmp指示qsort以怎样的方式排序,qsort的第一个实参是第一个要排序的数的地址,第二个实参是要排序的数组的个数,第三个实参是要排序的数组的类型的字节数,所以a[0]也可以改为int。

    (2)对多关键字段排序              

        先对字符串x从小到大排序,当字符串相同时,再按y从小到大排序,注意和对int排序时的不同点。

view plaincopy to clipboardprint?
#include <iostream>   
#include <cstring>   
#include <cmath>   
using namespace std;  
 
struct PN  
{  
    char x[10];  
    double y;  
}q[100];  
 
int cmp( const void *a, const void *b )  
{  
    PN *c = (PN *)a;  
    PN *d = (PN *)b;  
    if( strcmp(c->x,d->x)!=0 )  
        return strcmp(c->x,d->x);  
    return c->y > d->y ? 1 : -1;  /*注意与int比较的不同*/ 
}  
 
qsort(q,100,sizeof(q[0]),cmp);  
 高级应用:我们都知到快速排序是不稳定的,但通过把原数据和它的位置标号组成结构体,再进行多关键字段排序即可实现快速的稳定排序。

 

2、用sort必须先包含<algorithm>

    (1)使用模型

        以下是对10个整形数组从小到大排序的实例

 


view plaincopy to clipboardprint?
#include <iostream>   
#include <algorithm>   
using namespace std;  
 
bool cmp( const int& a, const int& b )  
{  
    if( a < b )  
        return true;   
    return false;  
}  
 
int main()  
{  
    int i, a[10]={10,9,8,7,6,5,4,3,2,1};  
    sort(a,a+10,cmp);  
    for( i=0; i<10; ++i )  
        cout <<a[i] <<" ";  
 
    return 0;  
}   


对多关键字的排序和qsort类似,就省了。据说sort比qsort要快点。

 


3、标准快速排序代码
int partition( int *num, int left, int right )  
{  
    int i, j, temp;  
    i = left;  
    j = right;  
    temp = num[left];  
    while( i < j )  
    {  
        while( i<j && temp<=num[j] )  
            j--;  
        if( i < j )  
        {  
            num[i] = num[j];  
            i++;  
        }  
        while( i<j && temp>=num[i] )  
            i++;  
        if( i < j )  
        {  
            num[j] = num[i];  
            j--;  
        }  
    }  
    num[j] = temp;  
    return j;  
}  
void quicksort (int *num, int left, int right )  
{  
    if( left < right )  
    {  
        int t = partition(num,left,right);  
        quicksort(num,left,t-1);  
        quicksort(num,t+1,right);  
    }  
}  
 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/afreesoul/archive/2008/12/27/3618428.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值