10.18 快速排序

休息了一个月多,开始学习了
记录一下Acwing的学习过程

快速排序思想

使用分治的思想

  1. 确定分界点:可以随机选取
  2. 调整区间:即将比分界点大的数移到右边,比分界点小的数移到左边
  3. 递归:分别对两个区间进行调整操作

重点在于调整区间的过程
一般有两种操作:

  1. 开额外的两个数组,然后对需要排序的区间进行扫描,大于X的放在一个数组中,小于X的放在另一个数组中,最后合并到一起。
  2. 双指针操作
    将两个指针i,j分别指向一段区间的开头和结尾,如果i指向的数字大于X,那么就停止,否则i++。如果j指向的数小于X,那么就停止,否则j–。当两个都停止了,就交换位置(注意要判断一下此时i<j)。
    当移动到i>=j时候,就退出。

注意这两个判断if(i<j){ swap(q,i,j); i++;j--; } if(i==j){ if(q[i]>x){ j++; }


#include<iostream>

using namespace std;

const int N=1e5+10; 

int q[N];
int n;

void swap(int q[],int a, int b){
	int tmp;
	tmp=q[a];
	q[a]=q[b];
	q[b]=tmp;
}


void quick_sort(int q[],int l, int r){
	//l,r是所需要排序的端点 
	
	if(l>=r)
		return;
	
	int x=q[(l+r)/2],i=l,j=r;
	
	while(i<j){
		while(q[i]<x)
			i++;  
		while(q[j]>x)
			j--;
		if(i<j){
			swap(q,i,j);
			i++;j--;
		}
		if(i==j){
			if(q[i]>x){
				j++;
			}
		}		
	}
	quick_sort(q,l,j);
	quick_sort(q,j+1,r);
}



int main(){
	
	cin>>n;
	
	for(int i=1;i<=n;i++)
		cin>>q[i];
	
	quick_sort(q,1,n);
	
	for(int i=1;i<=n;i++)
		cout<<q[i]<<' ';
	
	
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值