文章目录
快速排序
归并排序
一、快速排序
1.core idea:把<=x的数放左边,把.>=x的数放右边,分别最左边、右边排序(递归)——>如何放?左边>=的数与右边<=x的数交换位置即可——>在左边一直找>=x的数,直到找到;在右边一直找<=x的数,直到找到(do...while...)
2.代码如下:
int n,a[100005];
void quicksort(int l, int r){
if(l==r) return;
int i=l-1, j=r+1, x=a[(l+r)/2];
while(i<j){
do i++; while(a[i]<x); //向右找>=x的数
do j--; while(a[j]>x); //向左找<=x的数
if(i<j) swap(a[i],a[j]);
}
quicksort(l,j);
quicksort(j+1,r);
}
时间复杂度为
二、归并排序
1.core idea:将原数组从小到大存储进空数组中——>从原数组中间划成左边、右边([i,mid]、[j,r]),左边元素右边元素比较谁小,谁放进空数组,谁移一位——>直到一边为空,另一边剩余,把剩余都放进空数组中
2.代码如下:
int n, a[100010], b[100010];
void msort(int l, int r){
if(l==r) return;
int mid=l+r>>1;
msort(l,mid);
msort(mid+1,r); //拆分
int i=l, j=mid+1, k=l; //合并
while(i<=mid && j<=r){
if(a[i]<=a[j]) {b[k++]=a[i];i++;}
else {b[k++]=a[j];j++;}
}
while(i<=mid) {b[k++]=a[i];i++;}
while(j<=r) {b[k++]=a[j];j++;}
for(i=l; i<=r; i++) a[i]=b[i];
}
时间复杂度为