c++各种排序函数的用法

一直都是自己写排序算法,但是最近考试害怕自己写会超时,所以记录一下排序函数的用法。

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 ,还会在运行时检测下列错误,并调用当前安装的制约处理函数:

  • countsize 大于 RSIZE_MAX
  • keyptrcomp 是空指针(除非 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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值