最朴素的快速排序算法

package mz.ds.sort;

import java.util.List;

/**
 * 快速排序算法
 */
public class QuikSort <T extends Comparable<T>>{
	
	/**
	 * 待排序集合
	 */
	private List<T> list;
	
	public QuikSort(List<T> list) {
		this.list =list;
	}
	
	public List<T> quiksort() {
		if (list == null || list.size() ==0) {
			return null;
		}
		_quiksort(0, list.size()-1);
		return list;
	}

	/**
	 * 快速排序算法
	 * @param low
	 * @param high
	 */
	private void _quiksort(int low, int high) {
		if (low < high) {
			// 整理对象集合,并获取枢轴 的位置
			int pivot =_partition(low, high);
			// 整理左边
			_quiksort(low, pivot-1);
			// 整理右边
			_quiksort(pivot+1, high);
		}
	}

	/**
	 * 将要排序的集合一分为二,
	 * 默认枢轴的大小为low位置上的对象
	 * 
	 * @param low 低位置
	 * @param high 高位置
	 * @return 枢轴位置
	 */
	private int _partition(int low, int high) {
		// 枢轴 暂时设定就取第一个对象
		T pivotObj =list.get(low);
		// 从表两端交替扫描
		while(low < high) {
			// 从尾部向头部扫描
			while (low < high && list.get(high).compareTo(pivotObj) >=0) {
				--high;
			}
			// 将扫描到的小于枢轴的对象放到枢轴处
			list.set(low, list.get(high));
			
			// 从头部向尾部扫描
			while (low < high && list.get(low).compareTo(pivotObj) <=0) {
				++low;
			}
			// 将扫描到的大于枢轴的对象放到尾部
			list.set(high, list.get(low));
		}
		list.set(low, pivotObj);
		return low;
	}
}


试一下:

package mz.ds.sort;

import java.util.ArrayList;
import java.util.List;

public class TestMain {

	public static void main(String[] args) {
		List<Integer> list =new ArrayList<Integer>();
		// 初始化 要排序的集合,默认10个100以内的整数
		for (int i=0; i< 50; ++i) {
			list.add((int)(Math.random()*100));
		}
		printList(list);
		
		// 测试快速排序
		QuikSort<Integer> sort =new QuikSort<Integer>(list);
		List<Integer> slist =sort.quiksort();
		printList(slist);
	}
	
	public static void printList(List<Integer> list) {
		for (int i=0; i<list.size(); ++i) {
			System.out.print(list.get(i) +"\t");
			if ((i+1)%10 ==0) {
				System.out.println();
			}
		}
		System.out.println();
	}

}

输出结果:

45	86	75	99	78	41	96	0	26	0	
77	81	39	5	61	44	75	98	39	73	
71	11	66	68	17	50	71	94	43	25	
94	11	75	52	26	37	72	89	97	45	
81	92	33	56	35	57	56	9	43	3	



0	0	3	5	9	11	11	17	25	26	
26	33	35	37	39	39	41	43	43	44	
45	45	50	52	56	56	57	61	66	68	
71	71	72	73	75	75	75	77	78	81	
81	86	89	92	94	94	96	97	98	99


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值