快排分析

快排模板快排分析

分治的思想

  1. 确定分界点x: q[l], q[r], q[(l+r)/2]随机;
  2. 调整区间,使得x左边区间数 <= x右边区间数 >= x;(快排的核心所在)
  3. 递归处理左右两段
#include <bits/stdc++.h>

using namespace std;
const int N = 1e5 + 10;
int q[N];
void quick_sort(int q[], int l, int r){
	if(l >= r) return;  //判断边界,只有一个或者没有,则不排序 
	
	int i = l - 1, j = r + 1, x = q[l + r >> 1];  //x:分界点为中间值,i,j:边界左右两侧一个,有偏移量,因为do...while... 
	while(i < j){  //循环迭代,先移i,j 
		do i++; while(q[i] < x);
		do j--; while(q[i] > x);
		if(i < j) swap(q[i], q[j]);
	}
	quick_sort(q, l, j), quick_sort(q, j + 1, r);//递归处理左右两端 
}

int main(){
	int n;
	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;
}

posted @ 2022-11-28 08:59  csai_H  阅读(41)  评论(0)    收藏  举报