洛谷 P1177 快速排序

在这里插入图片描述

void quicksort(int left, int right) {
    
    
	int i, j, mid, temp;
	i = left;
	j = right;
	mid = a[(left + right) / 2];
	do {
    
    
		while (a[i] < mid) i++;
		while (a[j] > mid) j--;
		if (i <= j) {
    
    
			temp = a[i];
			a[i] = a[j];
			a[j] = temp;
			i++;
			j--;
		}
	} while (i <= j);
	if (i < right) quicksort(i, right);
	if (left < j) quicksort(left, j);
}

    left,right都表示数组的下标,先找到数组中间的数,然后进入循环,当左指针小于mid的时候,符合要求,左指针就往后移,当右指针大于mid的时候,符合要求,右指针往前移,当走到后面的if的时候,说明找到了a[i]>mid,a[j]<mid的情况,这个时候就需要将两个数换位置,然后左指针后移一位,右指针后移一位。依次循环,这个循环只是将比mid大的放右边,比mid小的放左边,但是mid的左右还没有排序,所以跳出循环以后,,如果i<right,就继续排mid右边的数字,如果left<j就继续排mid左边的数字。

#include<stdio.h>
int a[1000000];
int n;
void quicksort(int left, int right);
int main(void) {
    
    
	scanf("%d", &n);
	int i;
	for (i = 0; i < n; i++)
		scanf("%d", &a[i]);
	quicksort(0, n-1);
	for (i = 0; i < n; i++)
		printf("%d ", a[i]);
	return 0;
}
void quicksort(int left, int right) {
    
    
	int i, j, mid, temp;
	i = left;
	j = right;
	mid = a[(left + right) / 2];
	do {
    
    
		while (a[i] < mid) i++;
		while (a[j] > mid) j--;
		if (i <= j) {
    
    
			temp = a[i];
			a[i] = a[j];
			a[j] = temp;
			i++;
			j--;
		}
	} while (i <= j);
	if (i < right) quicksort(i, right);
	if (left < j) quicksort(left, j);
}

猜你喜欢

转载自blog.csdn.net/weixin_51656756/article/details/121261609