快速排序qsort和sort的用法

    技术2022-05-19  20

    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);       }   }   

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


    最新回复(0)