C/C++排序函数

  在应用中,如果我们不需要自己来编写排序函数的话,可以通过C/C++中已经实现的库函数来完成排序任务。

一、sort函数

  sort函数在C++中<algorithm>中,若要使用,需要加上头文件#include <algorithm>,它有如下几种形式:

  (1)默认情况按升序排列:

  假设数组为a[n],下标从0开始,对整个数组按升序排列:

int a[110], n; //n表示元素个数
sort(a, a+n);    //整个数组按升序排列

  (2)若要将某个区间的元素排列,比如需要将第3到第9个元素升序排列:

sort(a+3, a+10);    //3~9是7个数,注意后面那个数字为什么是10

  (3)如果需要按照降序排列,那么需要写一个cmp比较函数(一般按照升序排列的话,会调用默认的cmp函数:

bool cmp(int a, int b)
{
    return b < a;    //判断a与b的大小,因为降序,要b-a
}

  再使用sort函数:

sort(a, a+n, cmp); //降序排列,0~n-1

  (4) cmp功能是很强大的,你可以按照任意的方法,任意的组织自己的数组该如何排列:

    下面给个例子:对学生的成绩按降序排列:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

struct student
{
    char name[20];  //学生姓名
    int grade;      //学生分数
}ST[100];

bool cmp(student a, student b)  //注意这里是bool
{
    return a.grade > b.grade;   //判断大小,降序
}
int main()
{
    int n, gd;
    char str[20];
    scanf("%d", &n);    //输入学生人数
    for(int i = 0; i < n; i++)
    {
        scanf("%s%d", str, &gd);    //输入学生姓名和成绩
        strcpy(ST[i].name, str);    //存入学生结构体
        ST[i].grade = gd;
    }
    sort(ST, ST+n, cmp);
    for(int i = 0; i < n; i++)
        printf("第%d名:%s  %d\n", i+1, ST[i].name, ST[i].grade);
    return 0;
}

运行结果:

  sort函数很强大,复杂度O(nlog n),有兴趣的读者还可以自行探讨更多。

二、qsort函数

  qsort函数,也就是快速排序算法,在C的<stdlib>库中,需加入头文件#include <cstdlib> 或#include <stdlib.h>。

  调用qsort函数需要写cmp比较函数。

  给出按升序排列的例子:

int cmp(const void* a, const void* b)  //注意这里是int
{
    return (int*)a - (int*)b;
}

  调用:

qsort(a, n, sizeof(int), cmp);    //a为数组,n为个数

  如果需要按照自己的意愿排列,那么同样重写cmp比较函数,就可以完成,和sort函数类似。时间复杂度为O(n log n),但是某些情况要比sort函数好。

C/C++排序函数,布布扣,bubuko.com

时间: 2024-12-28 21:08:43

C/C++排序函数的相关文章

算法学习 - STL的p排序函数(sort)使用

排序函数sort() 这个函数是STL自带的,功能很强大~ 这里教下使用方法. sort()有三个参数,第一个是排序的起始位置,第二个是排序的结束位置,第三个是排序的判断函数.函数原型为: sort(<#_RandomAccessIterator __first#>, <#_RandomAccessIterator __last#>, <#_Compare __comp#>) 这个就是原型了~ 使用方法 首先假设我们有一个vector<int> vec;向量

泛型编程与C++标准模板库 : 浅谈sort()排序函数

以前用sort排序的时候,只知道sort函数有如下两种重载方式. template< class RandomIt > void sort( RandomIt first, RandomIt last ); template< class RandomIt, class Compare > void sort( RandomIt first, RandomIt last, Compare comp ); 当时对这些参数也不是很懂,只知道一些简单的用法. 1).比如: 如下代码可以使

python 自定义排序函数

自定义排序函数 Python内置的 sorted()函数可对list进行排序: >>>sorted([36, 5, 12, 9, 21]) [5, 9, 12, 21, 36] 但 sorted()也是一个高阶函数,它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1.如果 x 和 y 相等,返回 0. 因此,如果我们要实现倒序排序,只需要编写一个reversed_c

各种排序函数(摘)

sort的应用: 1.可以传入两个参数: sort(a,a+N) ,其中a是数组,a+N表示对a[0]至a[N-1]的N个数进行排序(默认从小到大排序): 2.传入三个参数: sort(a,a+N,cmp),第三个参数是一个函数 : 如果让函数从大到小排序,可以用如下算法实现: bool cmp(int a,int b){return a>b}; sort(A,A+N,cmp); 分排序函数函数:partial_sort: 例如,你现有一 个包含Widget对象(Widget意为“小挂件”)的v

hive分组排序函数 分组取top10

hive分组排序函数 分组取top10 语法:row_number() over( partition by 字段a order by 计算项b desc) rank --这里rank是别名 Partition by:类似hive的建表,分区的意思 这里按字段a分区,对计算项b进行降序排序 实例: 要取top10品牌,各品牌的top10渠道,各品牌的top10渠道中各渠道的top10档期 1) 取top10品牌 Select 品牌,count/sum/其他() as num from tb_na

排序函数重载

题目内容: 编写一组重载的排序函数,可以对两个整数.三个整数.四个整数.整数数组从大到小排序,函数名为sort,其中数组排序应使用递归的方法,另补充print函数,在一行显示排序后的数组元素. 主函数如下: int main() { int a,b,c,d; int data[100]; int k,n,i; cin>>k; switch(k) { case 1: cin>>a>>b; sort(a,b); cout<<a<<" &qu

C++ 排序函数 sort(),qsort()的使用方法

想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qsort,总算把自己解脱了~ 所以自己总结了一下,首先看sort函数见下表: 函数名 功能描写叙述 sort 对给定区间全部元素进行排序 stable_sort 对给定区间全部元素进行稳定排序 partial_sort 对给定区间全部元素部分排序 partial_sort_copy 对给定区间复制并排序 nth_element 找出给定区间的某个位置相应的元素 is_sorted 推断一个区间是否已经排好序 p

修改后的双向选择排序函数

1 void BiSelectSort( int a[ ], int n ) /* 双向选择排序函数 */ 2 { int i, j, k, kmax, kmin, t; 3 for( i=0, j=n-1; i<j; ++i, --j ) 4 { kmin=kmax=i; 5 for( k=i+1; k<=j; ++k ) //一趟扫描找出最大值和最小值 6 { if( a[k]<a[kmin] ) kmin=k; 7 if( a[k]>a[kmax] ) kmax=k; 8 }

【T-SQL系列】新的排序函数

原文:[T-SQL系列]新的排序函数 如:ROW_NUMBER.RANK.DENSE_RANK三个分析函数都是按照col1分组内从1开始排序 ROW_NUMBER() 是没有重复值的排序(即使两天记录相等也是不重复的),可以利用它来实现分页 DENSE_RANK() 是连续排序,两个第二名仍然跟着第三名RANK() 是跳跃拍学,两个第二名下来就是第四名 示例: DECLARE @t1 TABLE ( Sequence INT , Name VARCHAR(20) , Score INT ) IN