数据结构7

快速排序算法

在快速排序的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
也可以用第一个元素当pivot值
在这里插入图片描述
左右指针轮回移动

选中间的元素当pivot

private void quickSort1(int[]a,int left,int right) {
	int l=left;
	int r=right;
	int pivot=a[(l+r)/2];
	int temp=0;
	while (l<r) {
	//从左边开始直到找到大于等于pivot的下标
		while (a[l]<pivot) {
			l++;
		}
	//从右边开始直到找到小于等于pivot的下标
		while (a[r]>pivot) {
			r--;
		}
	//如果l>=r就说明所有的小于pivot的元素都移到了左边所有大于pivot的元素都移到了右边	
		if (l>=r) {
			break;
		}
	//交换标记的元素
		temp=a[r];
		a[r]=a[l];
		a[l]=temp;
		if (a[l]==pivot) {
			r--;
		}
		if (a[r]==pivot) {
			l++;
		}
	}
	//否则会出现栈溢出的情况
	if (l==r) {
		l++;
		r--;
	}
	//对左边的元素进行快速排序
	if (left<r) {
		quickSort(a, left, r);
	}
	//对右边的元素进行快速排序
	if (right>l) {
		quickSort(a, l, right);
	}
	
}

选头元素当pivot

private void quickSort2(int[]a,int L,int R) {
	//说明所有的小于pivot的元素都移到了左边所有大于pivot的元素都移到了右边	
	if (L>=R) {
		return ;
	}
	int left=L,right=R;
	//选头元素当pivot
	int pivot=a[left];
	while (left<right) {
		while (left<right&&a[right]>=pivot) {
			right--;
		}
		if (left<right) {
			a[left]=a[right];
		}
		while (left<right&&a[left]<=pivot) {
			left++;
		}
		if (left<right) {
			a[right]=a[left];
		}
		if (left>=right) {
			a[left]=pivot;
		}
	}
	quickSort2(a, L, right-1);
	quickSort2(a, right+1, R);
}

测试类

public class Kauisu {
	public static void main(String[] args) {
		int[]a=new int[1000];
		for (int i = 0; i < a.length; i++) {
			a[i]=(int)(Math.random()*1000);
		}
		Kauisu mm=new Kauisu();
		mm.QuickSort1(a, 0, a.length-1);
		mm.QuickSort2(a, 0, a.length-1);
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i]+" ");
		}
	}
	···
	···
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值