1. C语言:
void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );其中:
base:数组的起始地址
num:数组中元素个数
size:每个数组元素所占空间的字节数。使用sizeof来求
int ( * comparator ) ( const void *, const void * ): 用于判断待排序的数组中两个元素间的顺序关系。注意参数时void *型的,内部实现时先转换为真实类型。
注:C语言中没有泛型这些高级编程技术,但使用void * 指针可以达到该目的。
2. C++:
2.1 C++中包含C中的标准库,故可以使用qsort函数。
2.2 使用set容器(前提条件是待排序的集合中不包含重复元素):复杂度O(NlgN)
C++ set容器底层是采用二叉平衡树,故可以使用set来排序,只需依次把元素插入set容器即可。
代码片段:set<unsigned int> numbers;
void readFileToSet(const string & fileName, set<unsigned int> & numbers) {
ifstream fin(fileName.c_str());
assert(fin);
copy(istream_iterator<unsigned int>(fin), istream_iterator<unsigned int>(), inserter(numbers, numbers.begin()));
}
上面代码使用了copy这个算法和inserter这个辅助函数。inserter在底层实际上就是调用set容器的insert方法。
如何像qsort那样传入comparator呢?两种方法:
第一,在申明set时,可以申明使用的comparator类型,set的类型如下:
template < class Key, class Compare = less<Key>,
class Allocator = allocator<Key> > class set;
所以可以编写一个用于比较的class,在申明set时传入其第二个泛型参数。默认使用的是less<Key>, 底层就是用“<".
class Compare的编写方法:在class内部重载 operator(),返回bool类型。
第二,在set的构造函数中传入具体的comparator:这种方法既可以用于一般的函数指针,也可用于function object,而上面一种方法只能用于function object。
explicit set ( const Compare& comp = Compare(), const Allocator& = Allocator() );2.3 使用vector容器 + sort算法:list容器使用其成员函数sort
template <class RandomAccessIterator> void sort ( RandomAccessIterator first, RandomAccessIterator last ); 使用"<"来比较。 template <class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp ); 使用传入的Compare来比较。
3. Java:
3.1 使用Arrays.sort方法:用于数组
有各种重载的版本。注意三类:
第一类,用于primitive type。直接使用即可。
第二类,sort(Object[] a)
要求数组中元素Object实现Comparable接口。
第三类:sort(T[] a, Comparator<? super T> c)
传入Comparator接口。
3.2 List容器 + Collections.sort方法
sort(List<T> list)
sort(List<T> list,Comparator<? super T> c)
排序用的比较接口和Arrays中方式一样。
3.3 类似C++,使用TreeSet容器