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


  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
快速排序是一种常用的排序方法,在c标准库中也有相关的函数可以使用。快速排序的时间复杂度最好为O(nlogn),最坏情况下为O(n²),它是一种不稳定的排序方法。 在c标准库中,使用快速排序函数的方法如下: 1. 首先要包含头文件#include <algorithm>,这样才能使用标准库中的排序函数。 2. 定义一个自定义比较函数,该函数用于指定排序的顺序。比较函数需要两个参数,返回一个bool值,表示第一个参数是否应该排在第二个参数之前。如果想要从小到大排序,比较函数应该返回a>b;如果想要从大到小排序,则应该返回a<b。比较函数的定义可以放在main函数的前面部分。 3. 在使用快速排序函数时,需要传入三个参数:待排序数组的起始地址、结束地址(即最后一个元素的地址+1)、自定义比较函数函数名。如果不指定自定义比较函数,则默认按照从小到大的顺序排序。 以下是一个使用快速排序函数的示例代码: #include <iostream> #include <algorithm> using namespace std; bool cmp(int a, int b) { return a > b; } int main() { int a[] = {5,3,7,3,9,4}; sort(a, a+6, cmp); for(int i = 0; i < 6; i++) { cout << a[i] << " "; } return 0; } 这段代码中,定义了一个自定义比较函数cmp,用于从大到小排序。然后使用sort函数对数组a进行排序,指定了自定义比较函数cmp。最后输出排序后的数组a。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值