快速排序(含模板)

快速排序

思路

快速排序是在未排序数组中找一个基准(最左边的数),将所有比基准数小的数放在基准数左边,大的数放在基准数右边。最后在基准数左边用同样的方法,右边用同样的方法直到为顺序集合

算法流程:

递归参数:左,右边界

终止条件:左边界大于右边界

单次过程

  1. 以左边界为基准点
  2. 以左边界为左指针起始点,右边界为右指针起始点
  3. 先移动右指针,直到找到比基准点小或者遇到左指针停止
  4. 移动左指针,直到找到比基准点大或者遇到右指针停止
  5. 如果左右指针未相遇,则交换左右指针的两个数
  6. 以此类推直到左右指针相遇
  7. 交换基准点和此时的左右指针所指的值,完成局部排序

代码

#include <iostream>
using namespace std;

int a[101],n;//待排序数
void quickSort(int left,int right);
int main() {
	
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	
	quickSort(1,n);
	
	for(int i=1;i<=n;i++){
		cout<<a[i]<<" ";
	}
	return 0;
}


void quickSort(int left,int right) {
	//递归结束条件为可排序块为0 
	if(left > right) {
		return;
	}
	//temp为选定基准 
	int temp = a[left];
	int i = left;
	int j = right;
	int t;
	while(i!=j) {
		//移动右指针,直到找到比基准小 
		while(i<j && a[j]>=temp) {
			j--;
		}
		//移动左指针,直到找到比基准大 
		while(i<j && a[i]<=temp) {
			i++;
		}
	
		//两指针未相遇时交换 
		if(i<j) {
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
	}
	
	//将最终相遇点与基准交换 
	a[left] = a[i];
	a[i] = temp;
	
	//继续往左块和右块排序,直到最终为顺序集合 
	quickSort(left,i-1);
	quickSort(i+1,right);	
}

另一种解法的模板

void quick_sort(int q[],int l,int r){
    if(l >= r) return;

    int t = q[(l+r)/2],i = l - 1,j = r + 1;
    while(i < j){

        do i ++; while(q[i] < t);
        do j --; while(q[j] > t);
        if(i < j) swap(q[i],q[j]);

    }

    quick_sort(q,l,j);
    quick_sort(q,j + 1,r);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值