快速排序
#include <iostream>
using namespace std;
const int N=1e5;
int q[N],n; //待排序数组
int main()
{
cin>>n;
for(int i=0 ;i<n ;i++)
cin>>q[i];
quick_sort(q,0,n-1);
return 0;
}
一、递归
1、任意选择一个至作为中间值,将比中间值大的放在右边,小的放在左边,中间值可以是待排序数组中的任意一个数,这里取q[(l+r)/2]。
2、分别用两个指针i,j指向数组的首位,向中间值移动,如果去q[i]<q[j],交换两个值。
3、用递归的实现。
void quick_sort(int q[],int l,int r)
{
if(l>=r) return;
int i=l-1,j=r+1; //因为do-while循环要先制行++
int 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); //注意边界
}
不稳定排序
二、归并
1、假设当前数组可拆分成两个已经按大小排好的数组,取两个指针i,j分别指向两数组的左端,比较q[i]和q[j]&#