C++可直接使用的排序函数:qsort(),sort()

Posted by 超级苍蝇 on Oct 7, 2005 in 随风~ |

qsort() 和 sort()

(wysuperfly原创 v1.1)

//基于c++描述 <<将标准 C++ 视为一个新语言>>

使用C++编译器(VC6,G++等)可以使用STL里的sort()函数或者CRT中的qsort()来排序,这么好的函数我居然才知道,真是孤陋阿~总算摆脱整天冒泡的日子了~~~
[注] qsort () 可在任何C/C++编译器里使用。
而sort()函数是标准模板库的的函数可在C++编译器里使用。

赫赫,介绍一下:


使用
#include <iostream>
using namespace std;

开头的,可以直接使用这2个函数,而不用额外包含其他头文件。



qsort()    

.

.

应该就是用的快排。貌似是以数据块的方式移动数据,速度较快。

原型:
_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*));

解释:    qsort ( 数组名 ,元素个数,元素占用的空间(sizeof),比较函数) 
比较函数是一个自己写的函数  遵循 int com(const void *a,const void *b) 的格式。
当a b关系为 >  <  = 时,分别返回正值 负值 零 (或者相反)。
使用a b 时要强制转换类型,从void * 转换回应有的类型后,进行操作。 
数组下标从零开始,个数为N, 下标0-(n-1)。

示例:

int nn[100],n=100;
int com(const void *a,const void *b)
{
    return *(int*)a-*(int*)b;
}   

qsort((void *)nn,n,sizeof(int),com);

相关:

为什麽你必须给予元素个数?(因为阵列不知道它自己有多少个元素)为什麽你必须给予 double 的大小?(因为 qsort 不知道它要排序的单位是 doubles.)为什麽你必须写那个丑陋的、用来比较 doubles 数值的函式?(因为 qsort 需要一个指标指向某个函式,因为它不知道它所要排序的元素型别)为什麽 qsort 所使用的比较函式接受的是 const void* 引数而不是 char* 引数?(因为 qsort 可以对非字串的数值排序)Bjarne Stroustrup

sort()    

.

.

sort()函数是标准模板库的的函数,已经进行了优化,根据情况的不同可以采用不同的算法,所以较快。

在同样的元素和同样的比较条件下,sort()的执行速度都比qsort()要快。另外,sort()是类属函数,可以用于比较任何容器,任何元素,任何条件。

stl_algo.h 里面找到的:
template<typename _RandomAccessIterator>
    void
    __insertion_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)

只要开始和结束的地址就可以了。模板可以直接使用很多类型。

示例:

1:上面的程序:
sort(nn,nn+n);即可。

2:比较方便的字符串排序:

   char ch[20]="sdasdacsdasdas\0";
   cout<<ch<<endl;
   sort(ch,ch+14);
   cout<<ch<<endl;


3 Comments

周星星
Oct 9, 2005 at 3:54 pm

“在C++编译器(包括G++)里面可以直接使用qsort() sort()函数来排序”

— qsort是C的标准函数库成员之一,所以不要说“C++编译器(包括G++)”,因为既然它是标准库函数,那么任何一个C/C++编译器都应该包含它。

sort是C++的标准模板库成员之一,同理,任何一个C++编译器都应该包含它。(当然,TC++等不是C++编译器,它名字中的C++是早就被淘汰掉的C++,就如同我们不说黑猩猩是人类一样,虽然黑猩猩是人类的祖先)

在此,我讲讲C/C++标准库中各个排序算法的区别

1. qsort 隶属于标准C库,q 是 quick 的意思,按理是 快速排序算法,但编译器厂家会有不同的实现,不过可以保证的是,每一种实现都应该不比单纯的quick sort效率差。

2. sort 隶属于标准C++库,是一种分段统计组合算法

a. 当数据量很大时采用 quick sort,分段递归排序,直到数据量小于某个阀值。

b. 然后改用 insertion sort 。quick sort类似,但可以减少递归的负担。

c. 如果递归层次还是多深,采用 Heap Sort排序。

3. partial_sort 局部排序

4. partial_sort_copy 和3一样,只是拷贝到别处

5. stable_sort,它可以保证等值元素的相对次序不变


 
wy
Oct 9, 2005 at 10:35 pm

赫赫,因为我只知道在C++编译器(包括G++)里可以使用,加之这几天一直在做Online judge 选编译器总是只在C++ (VC 6)和 G++ 之中,以至于都快忘了 C 了,所以说得有点笼统~~

ps:学校只开c++的课,所以对C知之甚少,TC仅有耳闻~


 
飞鸟
Jun 5, 2008 at 11:41 pm

很精彩,拜读了!


 

Reply

click to change验证码

Copyright © 2012 SuperFly-超级苍蝇飞飞飞 All rights reserved. Theme by Laptop Geek.