算法学习——排序

一、简单排序:

很简单,使用sort进行排序,多种判断条件就建结构体、写cmp。

二、进阶排序:

分治

1、归并排序:

归并排序分为三个过程:

  1. 将序列分成两个部分(直接从中间分(有特殊要求再视情况而定)。)
  2. 将两个部分视为两个新数组,分别递归到两个子序列中进行归并排序,直到新数组只包含一个数,递归结束。
  3. 递归结束后,逐步合并两个已经排序的序列

归并操作分为五个步骤:

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2. 设定两个指针(l,r),最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4. 重复步骤3直到某一指针到达序列尾
  5. 将另一序列剩下的所有元素直接复制到合并序列尾

相关代码如下:

#include<bits/stdc++.h>using namespace std;

const int N=1e5+5;int n,a[N],b[N];

void merge(int arr1[],int len1,int arr2[],int len2,int arr[])//将两个有序序列arr1,arr2合并成一个序列arr{

    int i1=0,i2=0,i=0;

    while(i1<len1&&i2<len2)

    if(arr1[i1]<arr2[i2])arr[i++]=arr1[i1++];

    else arr[i++]=arr2[i2++];

    while(i1<len1)arr[i++]=arr1[i1++];

    while(i2<len2)arr[i++]=arr2[i2++];

}void merge_sort(int l,int r){

    if(l==r)return ;

    int mid=(l+r)/2;

    merge_sort(l,mid);merge_sort(mid+1,r);

    //数组b用来临时存放合并后的数组

    merge(a+l,mid-l+1,a+mid+1,r-mid,b);

    for(int i=l;i<=r;++i)a[i]=b[i-l];

}

int main(){

    scanf("%d",&n);

    for(int i=1;i<=n;++i)scanf("%d",a+i);

    merge_sort(1,n);

    for(int i=1;i<=n;++i)printf("%d%c",a[i]," \n"[i==n]);

}

2、cdq分治:

可以解决多维问题(通过时间复杂度加log进行降维)

​步骤:

  1. 1、将整个操作序列分为两个长度相等的部分
  2. 2、递归处理前一部分子问题
  3. 3、计算前一部分子问题修改操作后对后一部分子问题的影响
  4. 4、递归处理后一部分的子问题

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值