一、快排
思路————分治
1 确定分界点X 左端点arr[l] 右端点arr[r] 中间arr[(r+l)>>1]
2 调整 保证X左边的数<=X,右边的数>=X
3 递归
void quick_sort(int arr[],int l,int r)
{
if(l>=r) return ;
int x = arr[(l+r)>>1];
int i=l-1;
int j=r+1;
while(i<j)
{
do{
i++;
}
while(arr[i]<x);
do{
j--;
}
while(arr[j]>x);
if(i<j) swap(arr[i],arr[j]);
}
quick_sort(arr,l,j);
quick_sort(arr,j+1,r);
}
y总建议反复默写提交3-5次
二、归并排序
思路————分治
1 确定分界点 只能为 mid = (r+l)>>1
2 递归排序left right
3 归并 合二为一
void merge_sort(int q[],int l,int r)
{
if(l>=r) return;
int mid = r + l>>1;
merge_sort(q,l,mid);
merge_sort(q,mid+1,r);
int k=0;
int i=l;
int j=mid+1;
while(i<=mid&&j<=r)
{
if(q[i]<=q[j]) tmp[k++] = q[i++];
else tmp[k++]=q[j++];
}
while(i<=mid) tmp[k++] = q[i++];
while(j<=r) tmp[k++]=q[j++];
for( i=l,j=0;i<=r;i++,j++) q[i]=tmp[j];
}