快速排序的两种实现方式,主要是Partition函数的实现原理不一样

package test;

import java.util.Arrays;
import java.util.Random;

public class Partition {
	//方法一
	private int partition(int[] data, int length, int start, int end) throws Exception{
		System.out.println(Arrays.toString(data));
		if(data == null || length<=0 || start<0|| end>=length)
			throw new Exception();
		Random random = new Random();
		int index = random.nextInt(end)%(end-start+1) + start;
		System.out.println("index : "+index);
		swap(data, index, end);
		System.out.println(Arrays.toString(data));
		int small = start-1;
		for(index=start; index<end; ++index){
			if(data[index]<data[end]){
				++small;
				if(small != index)
					swap(data, index, small);
				System.out.println(Arrays.toString(data));
			}
		}
		++small;
		swap(data, small, end);
		System.out.println(Arrays.toString(data));
		System.out.println(small);
		System.out.println(Arrays.toString(data));
		return small;
	}
	
	public void quickSort(int[] data, int length, int start, int end) throws Exception{
		if(start == end){
			return;
		}
		int index = partition(data, length, start, end);
		if(index > start)
			quickSort(data, length, start, index-1);
		if(index<end)
			quickSort(data, length, index+1, end);
		
	}
	
	//方法二
	private int partition(int[] data, int left, int right){
		if(data ==null)
			throw new NullPointerException();
		int temp = data[left];
		while(left < right){
			while (left<right && data[right] > temp)
				right--;
			if(left<right)
				data[left++] = data[right];
			while(left<right && data[left] < temp)
				left++;
			if(left<right)
				data[right--] = data[left];
		}
		data[left] = temp;
		return left;
	}
	
	public void quickSort(int[] data, int left, int right) throws Exception{
		if(left == right){
			return;
		}
		int index = partition(data, left, right);
		if(index > left)
			quickSort(data, left, index-1);
		if(index<right)
			quickSort(data, index+1, right);
		
	}
	
	private void swap(int[] data, int index, int end){
		int temp = data[index];
		data[index] = data[end];
		data[end] = temp;
	}
	
	
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] data = {49,58,32,36,29,46,97};
		int[] data2 = {49,58,32,36,29,46,97};
		Partition partition = new Partition();
		try {
			partition.quickSort(data, data.length, 0, data.length-1);
			partition.quickSort(data, data.length, 0, data.length-1);
			System.out.println(Arrays.toString(data));
			System.out.println("==================================");
			partition.quickSort(data2, 0, data2.length-1);
			System.out.println(Arrays.toString(data2));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值