一直都是自己写排序算法,但是最近考试害怕自己写会超时,所以记录一下排序函数的用法。
sort函数
sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
Sort函数有三个参数:
(1)第一个是要排序的数组的起始地址。
(2)第二个是结束的地址(最后一位要排序的地址)
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
例如:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[20] = {9,8,7,6,5,4,3,1,2,0};
sort(a, a + 10);
for (int i = 0; i < 10; i++) {
cout << a[i] << endl;
}
return 0;
}
如果要倒序,加一个compare函数即可
#include<iostream>
#include<algorithm>
using namespace std;
bool compare(int a, int b) {
return a > b;
}
int main()
{
int a[20] = {9,8,7,6,5,4,3,1,2,0};
sort(a, a + 10,compare);
for (int i = 0; i < 10; i++) {
cout << a[i] << endl;
}
return 0;
}
qsort函数
void qsort( void *ptr, size_t count, size_t size,int (*comp)(const void *, const void *) );
qsort函数有4个参数:
(1)指向待排序的数组的指针
(2)数组的元素数目
(3)数组每个元素的字节大小,推荐使用sizeof(a[0])这样的表达式
(4)比较函数。若首个参数小于第二个,则返回负整数值,若首个参数大于第二个,则返回正整数值,若两参数相等,则返回零。
比较函数的签名应等价于如下形式:
int cmp(const void *a, const void *b);
该函数必须不修改传递给它的对象,而且在调用比较相同对象时必须返回一致的结果,无关乎它们在数组中的位置。
例如:
#include<iostream>
//#include<algorithm>
using namespace std;
int compare(const void *a, const void *b) {
return(*(int *)a - *(int *)b);
/*可见:参数列表是两个空指针,现在他要去指向你的数组元素。所以转型为你当前的类型,然后取值。
升序排列时,若第一个参数指针指向的“值”大于第二个参数指针指向的“值”,则返回正;若第一个参数指针指向的“值”等于第二个参数指针指向的“值”,则返回零;若第一个参数指针指向的“值”小于第二个参数指针指向的“值”,则返回负。
降序排列时,则刚好相反。
*/
}
int main()
{
int a[20] = {9,8,7,6,5,4,3,1,2,0};
qsort(a, 10, sizeof(a[0]), compare);
for (int i = 0; i < 10; i++) {
cout << a[i] << endl;
}
return 0;
}
qsort_s函数
qsort_s( void *ptr, rsize_t count, rsize_t size,int (*comp)(const void *, const void *, void *),void *context );
同 sort函数 ,除了传递给
comp
附加环境参数context
,还会在运行时检测下列错误,并调用当前安装的制约处理函数:
count
或size
大于 RSIZE_MAXkey
、ptr
或comp
是空指针(除非count
为零)
- 同所有边界检查函数,
qsort_s
仅若实现定义了 __STDC_LIB_EXT1__ ,且用户在包含stdlib.h
前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 才保证可用。
若
comp
指示两元素相等,则它们排序后的结果是未指定的。
context:附加信息(例如,对照序列),作为第三个参数传递给
comp
返回值成功时为零,若检测到运行时制约违规,则为非零。
partial_sort函数
partial_sort (RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);对给定区间部分排序
#include<iostream> #include<algorithm> #include<vector> using namespace std; bool compare(int a,int b) { return a<b;//升序 } int main() { int a[20] = {9,8,7,6,5,4,3,1,2,0}; vector<int>vec(a, a + 10); partial_sort(vec.begin(), vec.begin() + 5, vec.end(), compare); for (auto i : vec) { cout << i << ' '; } return 0; }
结果如图:
is_sorted函数
is_sorted(ForwardIterator first, ForwardIterator last)
判断数组是否有序
stable_sort函数
稳定排序,用法与sort函数相似。
参考:https://www.cnblogs.com/ForeverJoker/archive/2013/05/25/qsort-sort.html
https://www.cnblogs.com/jjzzx/p/5122381.html
http://zh.cppreference.com/w/c/algorithm/qsort