快速排序算法Java实现

快速排序算法Java实现

快速排序是运用广泛的一种排序算法,其时间复杂度是nlog(n),用到了分治的思想,以下是快排的Java实现。

首先定义一个接口Sorter,此接口的第一个sort方法接收一个list数组,该数组中的对象要求必须继承了Comparable类,通过Comparable类的compareTo()方法来进行比较;第二个sort方法接收一个list数组和一个Comparator 类型的比较器,利用比较器类的compare()方法来进行比较。

import java.util.Comparator;

public interface Sorter {
	public <T extends Comparable<T>> void sort(T[] list);
	
	public <T> void sort(T[] list, Comparator<T> comp);
}

接下来定义一个QuickSorter类,并实现Sorter接口,实现两个sort方法。

import java.util.Comparator;

//快速排序器
public class QuickSorter implements Sorter{

	//实现了Comparable接口的情况
	@Override
	public <T extends Comparable<T>> void sort(T[] list) {
		sort(list, 0, list.length-1);
	}
	
	private <T extends Comparable<T>> void sort(T[] list, int left, int right) {
		if(left >= right) {
			return;
		}
		
		int i = left;
		int j = right;
		T key = list[left];
		while(i < j) {
			while(i < j && list[j].compareTo(key) >= 0) {
				j--;
			}
			list[i] = list[j];
			while(i < j && list[i].compareTo(key) <= 0) {
				i++;
			}
			list[j] = list[i];
		}
		list[i] = key;
		sort(list, left, i-1);
		sort(list, i+1, right);
	}
	
	//传入比较器的情况
	@Override
	public <T> void sort(T[] list, Comparator<T> comp) {
		sort(list, comp, 0, list.length-1);
	}
	
	private <T> void sort(T[] list, Comparator<T> comp, int left, int right) {
		if(left >= right) {
			return;
		}
		int i = left;
		int j = right;
		T key = list[left];
		
		while(i < j) {
			while(i < j && comp.compare(list[j], key) >= 0) {
				j--;
			}
			list[i] = list[j];
			while(i < j && comp.compare(list[i], key) <= 0) {
				i++;
			}
			list[j] = list[i];
		}
		list[i] = key;
		sort(list, comp, left, i-1);
		sort(list, comp, i+1, right);
	}

}

最后写一个TestSorter类进行测试,这里使用了最简单的整型数组进行测试,也可以使用自定义的对象来进行排序,但是对象要继承Comparable接口或者再单独写一个Comparator类来进行比较。这里的Integer类型是java默认实现了Comparable接口的,所以可以直接用来排序。

import java.util.Random;

public class TestSorter {
	
	public <T> void printArray(T[] arr) {
		for(T i:arr) {
			System.out.print(i + " ");
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		TestSorter ts = new TestSorter();
		Sorter sorter = new QuickSorter(); //快排
		Integer arr[] = new Integer[10];
		Random random = new Random();
		for(int i=0; i<10; i++) {
			arr[i] = random.nextInt(100);
		}
		System.out.println("before sort:");
		ts.printArray(arr);
		sorter.sort(arr);
		System.out.println("after sort:");
		ts.printArray(arr);
	}
}

排序测试结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值