一、简单排序:
很简单,使用sort进行排序,多种判断条件就建结构体、写cmp。
二、进阶排序:
分治
1、归并排序:
归并排序分为三个过程:
- 将序列分成两个部分(直接从中间分(有特殊要求再视情况而定)。)
- 将两个部分视为两个新数组,分别递归到两个子序列中进行归并排序,直到新数组只包含一个数,递归结束。
- 递归结束后,逐步合并两个已经排序的序列
归并操作分为五个步骤:
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针(l,r),最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤3直到某一指针到达序列尾
- 将另一序列剩下的所有元素直接复制到合并序列尾
相关代码如下:
#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、将整个操作序列分为两个长度相等的部分
- 2、递归处理前一部分子问题
- 3、计算前一部分子问题修改操作后对后一部分子问题的影响
- 4、递归处理后一部分的子问题