排序算法(五).快速排序

算法实现:

quicksort.c

#include <stdio.h>

void display(int* arr,int len){
	int i = 0;
	for(i=0;i<len;i++){
		printf("%d,",arr[i]);
	}
	printf("\n");
}

void quicksort(int* arr, int l, int r){
	printf("l: %d, r:%d\n",l,r);
	int bp = l+1, ep = r;
	int tmp = arr[l],t=0;
	
	if(l>=r)	return;
	
//	printf("bp: %d, ep: %d\n",bp,ep);
	while(bp!=ep){

		while(arr[ep]>=tmp && bp<ep){
			ep--;
		}
		while(arr[bp]<=tmp && bp<ep){
			bp++;
		}
	printf("bp:%d,ep:%d",bp,ep);
	getchar();
	display(arr,r);
		if(bp<ep){
			printf(" %d <==> %d \n",arr[bp],arr[ep]);
			t=arr[bp];
			arr[bp]=arr[ep];
			arr[ep]=t;
		}
	}
	arr[l] = arr[bp];
	arr[bp] = tmp;
	
	display(arr,r);
	printf("------------\n");
	quicksort(arr,l,bp-1);
	quicksort(arr,bp+1,r);
}

int main(){
	int arr[15] = {3,4,2,5,1,9,6,7,10,11,14,13,12,0,8};
	quicksort(arr,0,14);
	display(arr,15);
}

l: 0, r:14
bp:1,ep:13
3,4,2,5,1,9,6,7,10,11,14,13,12,0,
 4 <==> 0
bp:3,ep:4
3,0,2,5,1,9,6,7,10,11,14,13,12,4,
 5 <==> 1
bp:3,ep:3
3,0,2,1,5,9,6,7,10,11,14,13,12,4,
1,0,2,3,5,9,6,7,10,11,14,13,12,4,
------------
l: 0, r:2
bp:1,ep:1
1,0,
0,1,
------------
l: 0, r:0
l: 2, r:2
l: 4, r:14
bp:5,ep:13
0,1,2,3,5,9,6,7,10,11,14,13,12,4,
 9 <==> 4
bp:5,ep:5
0,1,2,3,5,4,6,7,10,11,14,13,12,9,
0,1,2,3,4,5,6,7,10,11,14,13,12,9,
------------
l: 4, r:4
l: 6, r:14
bp:7,ep:7
0,1,2,3,4,5,6,7,10,11,14,13,12,9,
0,1,2,3,4,5,7,6,10,11,14,13,12,9,
------------
l: 6, r:6
l: 8, r:14
bp:9,ep:14
0,1,2,3,4,5,7,6,10,11,14,13,12,9,
 11 <==> 8
bp:10,ep:13
0,1,2,3,4,5,7,6,10,8,14,13,12,9,
 14 <==> 9
bp:10,ep:10
0,1,2,3,4,5,7,6,10,8,9,13,12,14,
0,1,2,3,4,5,7,6,9,8,10,13,12,14,
------------
l: 8, r:9
0,1,2,3,4,5,7,6,8,
------------
l: 8, r:8
l: 10, r:9
l: 11, r:14
bp:13,ep:14
0,1,2,3,4,5,7,6,8,9,10,13,12,14,
 14 <==> 11
bp:13,ep:13
0,1,2,3,4,5,7,6,8,9,10,13,12,11,
0,1,2,3,4,5,7,6,8,9,10,11,12,13,
------------
l: 11, r:12
0,1,2,3,4,5,7,6,8,9,10,12,
------------
l: 11, r:11
l: 13, r:12
l: 14, r:14
0,1,2,3,4,5,7,6,8,9,10,12,11,13,14,

算法思想理解:找一个分界点,让分界点左侧的元素都小于分界点,右侧都大于这个分解点,左侧和右侧可是是无序的。然后用递归分解对无序的数组在进行以上操作。需要注意的是递归的退出条件是元素下标的比较。

ps:排序算法的位置(下标)一定要十分小心。差一点都不行。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值