C,C++和Java中用于排序的API

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容器


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值