在平时刷算法题和oj的时候,排序算法是最经常用到的算法之一;且在各类算法书的目录中 也通常是将各种排序算法放在最前面来讲,可见排序算法的重要性。可能许多人都在算法书中有学过冒泡、快速排序的方法,也都大致了解其原理;实际应用时,冒泡排序是最为简单的,当然复杂度也是最高的.....(就如高德纳所说:"冒泡排序除了它迷人的名字和导致了某些有趣的理论问题这一事实之外,似乎没有什么值得推荐的");快排在理想情况下可以说是最高效的了(nlogn)。但快速排序并不像冒泡排序那样好理解和记忆,每次都需要自己回忆并把模板代码敲上去...想想就是一件挺麻烦的事。不过,还好在C++中有快排函数现成的可以用...想想就是件极好的事。
现在对sort()和qsort()的一些用法做下介绍,但讲的都并不完整,只是把比赛时常用的一些内容罗列出来。
sort函数:其实sort()并不能叫做快速排序,而应该说成智能排序;它正常情况下,会使用快排,但是发现快排恶化的话,会自动调整成其他排序来辅助。是最高效的排序。在C++的algorithm库中。
sort(begin,end); /*在[begin, end]中的元素进行排序按升序排列 sort()默认是按升序排序,如果要按降序排序,还需自己编写一个比较函数来实现 */
eg. :
int _main() { int a[20],i; for(i=0;i<20;i++) cin>>a[i]; sort(a,a+20); //按升序排序 for(i=0;i<20;i++) cout<<a[i]<<endl; return 0; }
这里的排序是升序的,那如果要降序的该怎么办呢?下面给出自己编写比较函数来实现的代码:
int cmp(int a,int b) { return a<b; //升序排列;改为return a>b,则为降序 } int main() { int a[20],i; for(i=0;i<20;i++) cin>>a[i]; sort(a,a+20,cmp); for(i=0;i<20;i++) cout<<a[i]<<endl; return 0; }
其实只是为了实现对整型和实型数组的升序、降序排序,可以有更简单的方法,无需自己再编函数,因为标准库里有现成的了,它提供了好些基于模板的比较函数对象,可以直接用的了;这里要用到的是greater<data_type>和less<data_type>。
- 升序:sort(begin,end,less<data-type>());
- 降序:sort(begin,end,greater<data-type>());
int main() { int a[20],i; for(i=0;i<20;i++) cin>>a[i]; sort(a,a+20,less<int>());//如果要按降序,就改为greater<int>() for(i=0;i<20;i++) cout<<a[i]<<endl; return 0; }
下面是qsort():
qsort(quicksort)根据你给的比较函数给一个数组快速排序,是通过指针移动实现排序功能。排序之后的结果仍然放在原来数组中。
qsort和compare的用法如下:
void qsort( void *base, size_len, size_data, int compare); int compare (const void *elem1, const void *elem2 ) ;
compare函数:
1 int compare(const void *a , const void *b ) 2 3 { 4 return *(int *)a - *(int *)b; //升序排序 5 6 //return *(int *)b - *(int *)a; //降序排序 7 8 }
上面是对Int型的排序,如果是字符型,就把int换为char。而double型的为下:
1 int cmp(const void*a,const void*b) 2 { 3 return *(double*)a>*(double*)b?1:-1;//升序 4 5 //return *(double*)b>*(double*)a?1:-1; 降序 6 }