1.排序
默写
课后习题 重写3-5遍
-
快速排序 分治
-
确定分界点x
-
调整区间
- 开两个额外的数组
- 两个指针
- i,j.i在最左边,j在最右边
- i从左往右走,直到指向的数大于x
- j往左走,直到指向的数小于x
- 交换i和j指向的数
- i继续往右走
- …
- 直到i>=j,此时x的左边都比x小,x的右边都比x大
-
递归处理左右两段,直到if(l>=r) return;这个底线条件,咔咔咔都返回回来了。
void quickSort(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]); } quickSort(q,l,j); quickSort(q,j+1,r); }
-
-
归并排序 分治
- 找分界点mid=(l+r)/2
- 递归排序
- 归并 合二为一
#include <iostream>
using namespace std;
int n;
const int N = 1e6+10;
int q[N],temp[N];
void mergeSort(int q[],int l,int r){
if(l>=r) return;
int mid=(l+r)>>1;
mergeSort(q,l,mid);
mergeSort(q,mid+1,r);
int i=l,j=mid+1,k=0;
while(i<=mid && j<=r)
if(q[i]<q[j]) temp[k++]=q[i++];
else temp[k++]=q[j++];
while(i<=mid) temp[k++]=q[i++];
while(j<=r) temp[k++]=q[j++];
for(i=l,j=0;i<=r;i++,j++) q[i]=temp[j];
}
int main(){
cin>>n;
for(int i=0;i<n;i++) cin>>q[i];
mergeSort(q,0,n-1);
for(int i=0;i<n;i++) cout<<q[i]<<" ";
}