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