快速排序基础入门

快速排序

时间复杂度
O(nlogn)。

#include
using namespace std;
const int N=1e5;
int N;
int q[];
voi quick_sort(int q[],int l,int r){
  if(l>=r)
     return;
   int i=l-1,j=r+1,x=q[l+r>>1];
   while(ix);
     if(i>n; 
  quick_sort(q,0,n)
}

快速排序也是分治算法(也可以看成二分吧)的一种提现
分治算法有三步:
1.分成子问题
2.递归处理子问题
3.子问题合并
快速排序快速理解:

快速排序基础入门_第1张图片

#include 
void quicksort(int left, int right, int *p) ;

int main() {
	int n, i;
	scanf("%d", &n);
	int *a = (int *)malloc((n + 1) * sizeof(int));
	for (i = 1; i < n + 1; i++)
		scanf("%d", &a[i]);
	quicksort(1, n, a);
	for (i = 1; i < n + 1; i++)
		printf("%4d", a[i]);
	free(a);
	return 0;


}

void quicksort(int left, int right, int *p) {
	int i, j, t, temp;
	if (left > right)
		return;
	temp = p[left];//temp就是基准数
	i = left;
	j = right;
	while (i != j) {
		while (p[j] >= temp && i < j)//顺序很重要必须先从右往左找
			j--;
		while (p[i] <= temp && i < j)//然后从左往右
			i++;
		if (i < j) {//当i和j没相遇时
			t = p[i];
			p[i] = p[j];
			p[j] = t;
		}
	}
	p[left] = p[i];
	p[i] = temp;
	quicksort(left, i - 1, p);//处理剩余的左边
	quicksort(i + 1, right, p);//处理剩余的右边

}

可以用本题https://www.luogu.com.cn/problem/P1177来测试一下自己学会没有哦!

你可能感兴趣的:(算法)