-
快速排序
- 步骤
- 1、确定分界点 x=q[(L+R)>>1]
2、调整区间 把区间划分为两个部分,左边的数<=x,右边的数>=x(最重要的)
3、递归处理左右两部分 - 时间复杂度
- 代码
#include<iostream> using namespace std; const int N = 1e5+10; int q[N]; //快排模板 void quick_sort(int q[],int L,int R) { if(L>=R) return; int i=L-1,j=R+1,x=q[L+R>>1]; while(i<j) { do i++;while(q[i]<x); do j--;while(q[j]>x); if(i<j) swap(q[i],q[j]); } quick_sort(q,L,j),quick_sort(q,j+1,R); } int main() { int n; cin >> n; for(int i=0;i<n;i++) scanf("%d",&q[i]); quick_sort(q,0,n-1); for(int i=0;i<n;i++) printf("%d ",q[i]); return 0; }
归并排序
- 思想方法基于分治
1、确定分界点 mid = L+R >> 1
2、递归排序左右两边
3、归并 合二为一(双指针算法)每次取得左右两个序列的最小值 - 稳定算法:原序列中数值相同排完序之后相对顺序是不变
- 时间复杂度 O(nlogn)
- 代码
#include<iostream> using namespace std; const int N = 1e5+10; int q[N],tem[N]; void merge_sort(int q[],int L,int R) { if(L>=R) return;//当只有一个或者没有 //(一)确定分界点 int mid=L+R>>1; //(二)递归处理左右两个部分 merge_sort(q,L,mid),merge_sort(q,mid+1,R); //(三)归并 int k=0,i=L,j=mid+1; //3.1去两者中的较小者拿出来 while(i<=mid && j<=R) { if(q[i]<=q[j]) tem[k++]=q[i++]; else tem[k++]=q[j++]; } //3.2当其中一方还没有比完,直接将后面的拿过来 while(i<=mid) tem[k++]=q[i++]; while(j<=R) tem[k++]=q[j++]; for(i=L,j=0;i<=R;i++,j++) q[i]=tem[j]; } int main() { int n; cin >> n; for(int i=0;i<n;i++) scanf("%d",&q[i]); merge_sort(q,0,n-1); for(int i=0;i<n;i++) printf("%d ",q[i]); return 0; }
//截止2020-2.6-22:08 重点掌握的就是快速排序与归并排序的代码思想步骤,这个在笔试的时候几乎不会用到,但是最后面试的时候听说会考到!