算法排序基本使用

概叙 : 刚刚开始学习算法,首先学习的是排序,很多的地方用的到的就是最基础的排序,然后会根据题目的意思根据哪一种情况开始排序,后面学习到的贪心的题目就需要根据自己重新定义结构体,来根据按照第几个关键字来排序(某个变量 用c++的重载来定义),最开始学习的就是简单排序,例如:冒泡,选择,插入 等,他们的时间复杂度都是O(n * n)的,一般的算法题,除了很小的范围可以过的情况下,一般都不能,到后面学的 快排,归并 的时间复杂度都是O(n * log n)的,一般的算法排序一般都是使用函数库里的sort函数。

1.一般的使用 sort() 函数

sort()函数一般是由小到大,使用sort()函数,头文件一定要加上   #include <algorithm>

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 100010;
int st[N];
int n;

int main()
{
    cin >> n;
    for(int i = 0; i < n;i ++ ) cin >> st[i];
    sort(st ,st + n);
    for(int i = 0;i < n ;i ++ ) cout << st[i] << " ";
    /*
    如果你的数组下标从一开始的话
    调用sort()函数
    sort(st + 1,st +n +1);    
    */
    
    return 0;
}

2.快速排序

在我看来快速排序的方法就是相当于每个数一直递归到每个数自己本身,在回归的途中将一组数据排好序。

#include <iostream>

using namespace std;

const int N = 100010;
int q[N];

void sort(int q[],int l ,int r)
{   if(l >= r) return;
    
    int x = q[l + r >>1],j = r +  1, i = l -1;
    while(i < j)
    {
        do i ++ ; while(q[i] < x); 
        //相当于指针从前面1 ~ j-1中查找比 x 大的数,找到就停止;
        do j -- ; while(q[j] > x); 
        //相当于指针从前面j ~ r中查找比 x 小的数,找到就停止;
        if(i < j) swap(q[i],q[j]); 
        //将两个指针的值交换
    }
    sort(q , l , j);
    sort(q, j +1 , r);
    
    
}

int main()
{
     int n;
     cin >> n;
     for(int i = 0; i < n;i ++ ) cin >> q[i];
     sort(q , 0 , n-1);
     for(int i = 0; i < n;i ++ ) cout << q[i]<< " ";
    
    return 0;
}

3.定义结构体内部的比较函数

这种类型一般要根据题目的意思,一般的sort()函数都是根据字典序排序的,在一般的容器里,也是以第一个为关键字来排序,所以有些题目需要定义结构体的比较函数,所以我们需要一个模板。

struct Range
{
    int l, r;
    bool operator< (const Range &W)const
    {
        return r < W.r;
    }
}range[N];

这个模板就是重新 定义比较函数 以 r 为关键字来用sort()函数来排序,所以要根据题目的意思来排序。

对于排序的理解再慢慢加深.......

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值