quicksort 快速排序的原理和代码实现

《C语言程序设计-第2版》的解读

注意理解“空位”,这里的空位在物理内存上并未空,是我们为了分析问题假设的。因为这样思考的话,我们能很放心大胆地将high指向的错排数据给low指向的“空位”。容易发现,low和high至少有一个指向空位,其中low位置最初指向的是index元素,那么它最初指向的也是个“空位”。

空位不断改变。最后low = high的空位就是给index的!

 

 

代码实现解析

问:能否将if(low >= high)   break;修改为low == high?

可以,在low/high指标向大/向小行走的过程中,不会出现low>high的情形.

 

问:能否将if(s >= e) return;修改为s == e?

不能!因为传进来的s和e,可能s == e或s == e+1的情况,分别说明上一次划分后,index左边只有一个元素,或者index左边没有元素。这两种情况都不需要对index"左边"的元素再进行下一次的局部排序。

#include<iostream>
using namespace std;
void printa(int *a){//测试工具 
	for(int i = 0;i < 10;i++){
		printf("%d ",a[i]);
	}
		printf("\ntest over\n\n");
} 

int split(int *a,int s,int e){
	int low = s,high = e;
	int t = a[s];
	while(1){ 
		while(low < high && a[high] >= t)
		high--;
			
		if(low >= high)
		break;

		
		a[low++] = a[high];

		
		while(low < high &&a[low] <= t)
		low++;
		
		if(low >= high)
		break; 
		
		a[high--] = a[low];
			

	}
	a[low] = t;
	return low;
}	//low和high肯定有一个指向“空” 

void quicksort(int *a,int s,int e){
	int middle;
	if(s >= e) return;
	middle = split (a,s,e);
	quicksort(a,s,middle-1);
	quicksort(a,middle+1,e);
	
}
int main(){
	int a[10] = {27,-1,3,10,23,452,32,4,77,101};
	quicksort(a,0,9);
	for(int i = 0;i < 10;i++){
		printf("%d ",a[i]);
	}
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值