快排
快排采用分治的思想
分治算法都有三步:
1. 分成子问题
2. 递归处理子问题
3. 子问题合并
在数组中任取x,分成大于x,和小于x的两部分,再对这两部分分别进行递归,按从大到小排列,即整个数组的排序完成
可以使用指针进行操作,在两侧分别取指针i,j ,i若大于所指的数则向右移动,j若小于的数则向左移动,如果i小于所指的数,等到j大于所指的数时,两指针的数进行交换,之后继续移动,确保分成大于x,和小于x的两部分
模板 ( 从小到大)
#include<iostream>
using namespace std;
const int N=100000000;
int n;
int q[N];
void quick_sort(int q[],int l,int r)//l,r为边界
{
	if(l>=r) return;//判断区间是否存在
	int x=q[l + r >> 1],i=l-1,j=r+1;//定义指针,i和j的定义是因为在后面的代码中采用了先移动后交换的做法,i和j 能确保找到真正的边界
	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()
{
	scanf("%d",&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;
 } 
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号