快速排序 快速理解

10 篇文章 0 订阅
6 篇文章 0 订阅
#include<stdio.h>
#define max 10

void print(int a[],int n); 					//打印 
int Partition(int a[],int low,int high);	//划分 
int QuickSort(int a[],int low,int high);	//利用迭代划分的快排 

void print(int a[],int n) {
	for(int i=0;i < n;i++)
		printf("%d ",a[i]);
	printf("\n");
}

//交换排序-快速排序 
int Partition(int a[],int low,int high){
	int pivot = a[low];
	while(low < high){  							 //思考一下:两个while子循环位置能交换吗?   					不能,因为pivot开始存的的a[low]的值,最后可以把a[low]的值复现,如果交换顺序a[high]的值被覆盖就不能还原了
		printf("low=%d \t high=%d\n",low,high); 
		while(low<high && a[high]>=pivot) --high;  
		a[low] = a[high];						 //此时不符合while判断条件,说明a[high] < pivot所以把a[high]放左边 
		while(low<high && a[low]<=pivot) ++low;
		a[high] = a[low]; 						//此时不符合while判断条件,说明a[low]  > pivot所以把a[low]放右边 
	}
	a[low] = pivot;  								//第一趟排序结束,low=high的位置赋值最初的a[low],比他大的在它右遍,比他小的在他左边 
	return low;									    //返回最终确定的pivot的切分位置,这个位置左边比他小,右遍比他大。 
}

int QuickSort(int a[],int low,int high){
	if(low < high){								//递归的跳出条件 
		int pivotpos = Partition(a,low,high);	//找到最初的切分点 
		QuickSort(a,low,pivotpos-1);			//切分点左边排序 
		QuickSort(a,pivotpos+1,high);			//切分点右边排序  注意要加1 因为pivotpos的位置就是最终位置不需要再参与后续排序了 
	}
}



int main(){
	int a[10] = {2,1,4,3,7,9,8,5,6,10};
	printf("排序前: ");
	print(a,max);
	QuickSort(a,0,9);
	printf("排序后: ");
	print(a,max);
	
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值