快速排序

快速排序的大致步骤是:
1.确定基准值(把区间的最右侧作为基准值)
2.遍历整个区间,使比基准值小的数在基准值左边,比基准值大的在基准值右边
3.分治算法依次解决左右两个小的无序区间
4.直到小区间size= =0小区间没有数,size==1小区间只有一个数,有序

要排序的区间使array[left,right]
void QuickSort(int array[],int left,int right)

size==0
if(left>right){
return;
}

size= =1
if(left==right){
return;
}

确定基准值array[right],
Partition(array,left,right)遍历整个区间
基准值的最终下标为 d
d=Partition(array,left,right);

左侧小区间为 array[left,d-1)
右侧小区间为array[d+1,right)
分治算法解决两个小区间
QuickSort(int array,left,d-1);
QuickSort(int array,d+1,right);

Partition(array,left,right);
遍历区间把小的放基准值左边,大的放在基准值右边有三种方法:
1.hover 法


int Parition_1(int array[], int left, int right) {
	int begin = left;
	int end = right;
	// 基准值是 array[right]

	while (begin < end) {
		// 优先走左边
		while (begin < end && array[begin] <= array[right]) {
			begin++;
		}
		// 一定是左边卡住了

		// 再走右边
		while (begin < end && array[end] >= array[right]) {
			end--;
		}
		// 一定是右边也卡住了

		Swap(array + begin, array + end);
	}
// 区间被分成 小,大,基准
	Swap(array + begin, array + right);

	// 返回当前基准值所在位置
	return begin;
}里插入代码片

int Parition_1(int array[], int left, int right) {
int begin = left;
int end = right;
// 基准值是 array[right]

while (begin < end) {
	// 优先走左边
	while (begin < end && array[begin] <= array[right]) {
		begin++;
	}
	// 一定是左边卡住了

	// 再走右边
	while (begin < end && array[end] >= array[right]) {
		end--;
	}
	// 一定是右边也卡住了

	Swap(array + begin, array + end);
}

// 区间被分成 小,大,基准
Swap(array + begin, array + right);

// 返回当前基准值所在位置
return begin;

}

2.挖坑法

 int Parition_2(int array[], int left, int right){
    	int pivot = array[right];   //基准值
    	int begin = left;
    	int end = left;
    	while (begin<end){
    		//走begin向右走
    		while (array[left] <= pivot&&begin < end){
    			begin++;
    		}
    		//当arrayy[left]大与基准值的时候跳出循环在左侧挖坑将array[left]填入右侧的坑中
    		array[end] = array[begin];
    		//走end向左走
    		while (array[end] >= pivot&&begin < end){
    			end--;
    		}
    		array[begin] = array[end];
    	}
    	array[begin] = pivot;
    	return begin;
    }

3.上下标法

int Parition_3(int array[], int left, int right){
	int d = left;
	
	for (int i=left; i < left; i++){
		if (array[i] < array[right]){
			Swap(array + d, array + i);
			d++;
		}
	}
	Swap(array + d, array + right);
	return array[d];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值