您的位置:首页 > 其它

qsort()与sort()排序区别 汇总

2012-02-05 22:19 148 查看
一、使用

1.qsort

qsort()是C中的排序函数,其头文件为:#include<stdlib.h>

void qsort( void*base, size_t num, size_t width, int (__cdecl *compare )

int compare (constvoid *elem1, const void *elem2 ) );

qsort(quicksort)主要根据你给的比较条件给一个快速排序,主要是通过指针移动实现排序功能。排序之后的结果仍然放在原来数组中。

参数意义如下:

base:需要排序的目标数组开始地址

num:目标数组元素个数

width:目标数组中每一个元素长度

compare:函数指针,指向比较函数

代码举例:

int num[100];
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
qsort(num,100,sizeof(num[0]),cmp);


2.sort

sort()函数是C++中的排序函数,其头文件为:#include<algorithm>

sort是qsort的升级版,如果能用sort尽量用sort,使用也比较简单,不像qsort还得自己去写 cmp 函数,只要注明使用的库函数就可以使用.

默认sort排序后是升序,如果想让他降序排列,可以使用自己编的cmp函数。

代码举例:

#include <ctime>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int val[50];
srand(time(NULL));
for(int i=0; i<50; i++)
{
val[i] = rand()%100;
cout<<val[i]<<" ";
}
cout<<"排序后输出:"<<endl;
sort(val, val+50);
for(i=0; i<50; i++)
{
cout<<val[i]<<" ";
}
return 0;
};


二、性能

比较函数采用的快速排序是一个递归的过程,每次处理一个数列的时候,就从数列中选出一个数,作为划分值,然后在这个数列中,比划分值小的数移动到划分值的左边,比划分值大的数移动到划分值的右边。经过一次这样的处理之后,这个数在最终的已排序的数列的位置就确定了。然后我们把比这个数小和比这个数大的数分别当成两个子数列调用下一次递归,最终获得一个排好序的数列。上面介绍的是基本快速排序的方法,每次把数组分成两分和中间的一个划分值,而对于有多个重复值的数组来说,基本排序的效率较低。集成在C语言库函数里面的的qsort函数,使用三路划分的方法解决这个问题。所谓三路划分,是指把数组划分成小于划分值,等于划分值和大于划分值的三个部分。
三、快排的一些小问题

1.快排是不稳定的,这个不稳定一个表现在其使用的时间是不确定的,最好情况(O(n))和最坏情况(O(n^2))差距太大,我们一般说的 O(nlog(n))都是指的是其平均时间.

2.快排是不稳定的,这个不稳定表现在如果相同的比较元素,可能顺序不一样,假设我们有这样一个序列,3,3,3,但是这三个3是有区别的, 我们标记为3a,3b,3c,快排后的结果不一定就是3a,3b,3c这样的排列,所以在某些特定场合我们要用结构体来使其稳定(No.6的例子就 是说明这个问题的)
3.快排的比较函数的两个参数必须都是const void *的,这个要特别注意,写a和b只是我的个人喜好,写成cmp也只是我的个人喜好.推荐在 cmp里面重新定义两个指针来强制类型转换,特别是在对结构体进行排序的时候

4.快排qsort的第三个参数,那个sizeof,推荐是使用sizeof(s[0])这样,特别是对结构体,往往自己定义2*sizeof(int)这样的会出问题, 用sizeof(s[0)既方便又保险。
5.如果要对数组进行部分排序,比如对一个s
的数组排列其从s[i]开始的m个元素,只需要在第一个和第二个参数上进行一些 修改:qsort(&s[i],m,sizeof(s[i]),cmp);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: