2020-05-28数据结构与算法-快速排序

2020-05-28数据结构与算法-快速排序

算法原理:
(1)首先找到一个分界值(一般找第一个索引对应的值)
(2)把比分界值的数放在分界值左边大或等于的数放在分界值右边
(3)重复2的步骤,直至分解完。
(4)把最后排好序的两边数据合拼在一起就可以了
在这里插入图片描述切分原理:
(1)首先是设置一个分界值和两个指针,左指针(往右移)和右指针(往左移)
(2)左指针找到一个比分界值大的数,停止,左指针找到比分界值小的数,停止,交换两个数,继续这个操作
(3)直到左指针的值大于右指针的值时,结束。

package quick_sort;
import java.util.*;
public class quick {
	public static boolean less(Comparable u,Comparable v) { //判断u是否小于v
		return   u.compareTo(v)<0;
	} //比较两个数的大小,若小于,则输出1,若大于则输出0

	public static void exchange(int [] a,int i,int j) {
		int temp;
		temp=a[i];
		a[i]=a[j];
		a[j]=temp;

	}
	public static void sort(int [] a) {   //对数组内的元素进行排序
		//定义一个lo索引和一个hi索引 初始化辅助数组
		// Comparable [] assist = new Comparable[a.length]; //
		int lo=0;    //最低位索引
		int hi=a.length-1;   //最高位索引
		//调用sort重载方法
		sort(a,lo,hi);		
	}
	
	private static void sort(int [] a,int lo,int hi) { //对数组内的元素索引lo到索引hi进行排序
		if(lo>=hi) {
			return ;
		}       //数据不合理直接返回
		//分组
		int partition=partition(a,lo,hi);
		sort(a,lo,(partition-1));
		sort(a,(partition+1),hi);
		
	}
	private static int partition(int [] a,int lo,int hi) {
		if(lo>=hi) {
			return -1;
		} //安全性校验
	//确定分界值
	Comparable key=a[lo];
	//定义两个指针,分别指向最大索引处的下一个值和最小索引处的下一个值
	int left=lo;
	int right=hi+1;
	//切分
	while(true) {
		//right向左移动,找到一个比分界值小的元素,停止
		while(less(key,a[--right])) {
			if(right==lo) {
				break;
			}
		}
		//left向右移动,找到一个比分界值大的元素,停止
		while(less(a[++left],key)) {
			if(right==hi) {
				break;
			}
		}	
		
		//判断left是否大于等于right,如果是,则扫描结束,结束循环,交换元素即可
		if(left>=right) {
			break;
		}else {
			exchange(a,left,right);
		}
	}
	//交换分界值
	
	exchange(a,lo,right);
	return  right;
	
	}
}

package quick_sort;

import java.util.Arrays;


public class quick_test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// TODO Auto-generated method stub
		int [] a= {1,4,5,6,8,9,3,2};
	      quick.sort(a);
	       System.out.println(Arrays.toString(a));
	}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值