【STL】C中的qsort与C++中的sort
对于一个有N个元素的数组/vector,如果N比较小,要进行排序,此时可以考虑C语言中的库函数qsort、C++中的sort函数,二者是基于快速排序的函数。(具体原理待后续需要再详细了解,只考虑其简单用法)
最初了解是在Tsinghua DSA的PA作业中,因为规定了不能用STL,得自己写函数实现数据结构的一些功能。但有些C语言中的库函数又可以用,其中就有用来排序的qsort。当时并不知道这是什么,只是参照别人的代码加以利用了这个函数,可以排序就没有再去深入了解了。现在做上机题,看到一个只有5个数的vector需要进行排序,提示是用了qsort。搜索之后又看到了更简单好用的sort,暂时记下这两个函数的简单用法。
C语言中的qsort函数,需要加上头文件stdlib.h
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
base是要排序的对象的起始地址,num是排序对象的大小,size是排序对象的数据类型所占的字节数,compar是比较函数。
比较函数需要自己手动写,比较的是什么数据类型,对应的cmp函数return时,a,b指针指向的就是什么类型。
如果比较的是char类型的数组,因为依据的是字符的ASCII码值,所以返回类型依旧是int,return时a,b的类型强制转换成(char *)。
如果比较的是double类型的数组,return的是两个数的大小比较结果。
1 #include <stdlib.h> 2 #include <iostream> 3 4 using namespace std; 5 6 int cmp(const void *a, const void *b){ 7 return *(int *)a - *(int *)b; //进行升序排序,降序a,b位置互换 8 } 9 10 int main(){ 11 int arr[] = {1, 5, 3, 1, 4, 2}; 12 qsort(arr, 6, sizeof(int), cmp); 13 for (int i = 0; i < 6; i++) 14 cout << arr[i] << " "; 15 return 0; 16 }
C++中的std::sort函数,使用较qsort方便。
使用时,要加头文件algorithm
第1种形式,用默认的排序函数(升序):
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);
传入的参数只有两个,迭代器的起始和终止地址,该范围的区间是[begin,end)
1 #include <algorithm> 2 #include <iostream> 3 4 using namespace std; 5 6 int main(){ 7 vector<int> arr{5,4,3,2,1}; 8 sort(arr.begin(), arr.end()); 9 10 for (int i = 0; i < arr.size(); i++) 11 cout << arr[i] << " "; 12 return 0; 13 }
第2种形式,自己写比较函数
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
1 #include <iostream> 2 #include <algorithm> 3 #include <functional> 4 #include <vector> 5 using namespace std; 6 7 class myclass { 8 public: 9 myclass(int a, int b):first(a), second(b){} 10 int first; 11 int second; 12 bool operator < (const myclass &m)const { 13 return first < m.first; 14 } 15 }; 16 17 bool less_second(const myclass & m1, const myclass & m2) { 18 return m1.second < m2.second; 19 } 20 21 int main() { 22 23 vector< myclass > vect; 24 for(int i = 0 ; i < 10 ; i ++){ 25 myclass my(10-i, i*3); 26 vect.push_back(my); 27 } 28 for(int i = 0 ; i < vect.size(); i ++) 29 cout<<"("<<vect[i].first<<","<<vect[i].second<<")\n"; 30 sort(vect.begin(), vect.end()); 31 cout<<"after sorted by first:"<<endl; 32 for(int i = 0 ; i < vect.size(); i ++) 33 cout<<"("<<vect[i].first<<","<<vect[i].second<<")\n"; 34 cout<<"after sorted by second:"<<endl; 35 sort(vect.begin(), vect.end(), less_second); 36 for(int i = 0 ; i < vect.size(); i ++) 37 cout<<"("<<vect[i].first<<","<<vect[i].second<<")\n"; 38 39 return 0 ; 40 }
第2种形式例子来源于 详细解说 STL 排序(sort)