/* FileName: main.cpp Title: qsort & sort Author: caigen (at) HuaQiao University Time: 2011/3/30 */ #include <cstdlib> void qsort(void *buf,size_t num,size_t size,int (*compare)(const void *,const void *)); /* 1,qsort函数使用快速排序将buf记录排序,其元素数目为num,单个元素大小为size。 2,当第一个元素小于第二个元素时,compare函数返回-1;相等返回0;大于返回+1。 3,排序后记录为升序。 4,函数原型中的(*compare)指示其为函数指针。 例子: int compare_ints(const void *a,const void *b) { int *arg1=(int *) a; int *arg2=(int *) b; if( *arg1<*arg2 ) return -1; else if( *arg1 == *arg2 ) return 0; else return 1; } qsort( array, array_size, sizeof(int), compare_ints ); */ #include <algorithm> using std::sort; void sort(iterator start,iterator end); void sort(iterator start,iterator end,StrictWeakOrdering cmp); /* 1,sort()算法将在区间 [start,end)中的元素升序排列。 2,如果两个元素相等,不能保证其维持原来顺序。 3,默认使用<操作符,如果定义比较函数cmp,则使用cmp。 4,sort()算法内部是introsort(内观排序,自省的快排)算法 5,时间复杂度O(N*log(N)) (平均和最坏) 例子:(降序排列) bool cmp( int a, int b ) { return a > b; } sort( v.begin(), v.end(), cmp ); 附:introsort原理 (1)三点中值法。取中间大小的为PIVOT; (2)分割函数,使用中间左右两部分:L< M < R, 返回M; (3)左部分递归调用,右部分在循环中处理; (4)若分割层次大于2*K( K <= lg2N),则调用heapsort,防止退化为N2..; (5)若当前进入的子序列长度< 16,则退出;(宗旨是调用QUITSORT使之基本有序) (6)当整个序列基本有序后,直接调用简单插入排序。 */ // 附:stable_sort partial_sort nth_element() #include <algorithm> using std::stable_sort; void stable_sort( iterator start, iterator end ); void stable_sort( iterator start, iterator end, StrictWeakOrdering cmp ); /* 1,升序排列。 2,稳定排序。其代价是增加了时间复杂度,最坏情况下为O(N*(log(N))^2)。 */ using std::partial_sort; void partial_sort( iterator start, iterator middle, iterator end ); void partial_sort( iterator start, iterator middle, iterator end, StrictWeakOrdering cmp ); /* 1,将区间[start,end)中的前N个元素升序排列; 2,N由start与middle确定。 */ using std::nth_element; void nth_element( iterator start, iterator middle, iterator end ); void nth_element( iterator start, iterator middle, iterator end, StrictWeakOrdering cmp ); /* 1,同partial_sort。 */