快速排序-java实现

快速排序:

将数据列表进行分区,然后对分区进行递归式排序,从而完成对整个列表的排序。

排序策略:

1.选择一个列表元素作为分区元素;
2.分割该列表,使小于分区元素的值位于分区元素左边,大于分区元素的值位于分区元素右边;
3.将上述两个步骤递归用于两个分区;
4.直到一个分区只含有一个元素,其内在就已经排好序了。


例子:

初始:305 65 7 90 120 110 8
将90作为分区元素,重新组织列表得到:8 65 7 90 120 110 305
再对分区元素左右两边递归进行快速排序。

Code:

/*
*Created on 2016年7月10日
*Copyright 2016 Yong Cai Limited crop. All Rights Reserved
*
*/

package org.cy.sort;

public class QuickSort {

	public static void main(String[] args) {
		String[] str = {"f","qq","wei","chat","phone","nba"};
		printArr(quickSort(str));
	}
	
	
	public static <T extends Comparable<? super T>> T[] quickSort(T[] data){
		quickSort(data,0,data.length - 1);
		return data;
	}
	
	public static <T extends Comparable<?super T>> T[] quickSort(T[] data, int minIndex, int maxIndex){
		if(minIndex < maxIndex){
			int partitionIndex  = partition(data, minIndex, maxIndex);
			quickSort(data, minIndex, partitionIndex - 1);
			quickSort(data, partitionIndex + 1, maxIndex);
		}
		return data;
	}
	
	public static <T extends Comparable<? super T>> int partition(T[] data, int minIndex, int maxIndex){
		int left;
		int right;
		int mid = (minIndex + maxIndex) / 2;
		
		T partitionElem = data[mid];
		swap(data, mid,minIndex);
		left = minIndex;
		right = maxIndex;
		
		while(left < right){
			while(left < right && data[left].compareTo(partitionElem) <= 0){
				left++;
			}
			
			while(data[right].compareTo(partitionElem) > 0){
				right--;
			}
			
			if(left < right){
				swap(data, left, right);
			}
		}
		
		swap(data, minIndex, right);
		return right;
	}
	
	public static <T> void swap(T[] data, int pos1, int pos2){
		T tmp;
		tmp = data[pos1];
		data[pos1] = data[pos2];
		data[pos2] = tmp;
	}
	
	public static <T> void printArr(T[] data){
		int len = data.length;
		for(int i = 0; i < len; i++){
			System.out.print(data[i] + " ");
		}
		System.out.println();
	}

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值