算法---快速排序

快速排序

 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。java

 * 步骤为:app

 * 从数列中挑出一个元素,称为"基准"(pivot),从新排序数列,全部元素比基准值小的摆放在基准前面,全部元素比基准值大的摆在基准的后面(相同的数能够到任一边)。ide

 * 在这个分区结束以后,该基准就处于数列的中间位置。这个称为分区(partition)操做。ui

 * 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。spa

/**
 *
 * @author Administrator
 *
 */
public class QuickSort {
	 public static void main(String[] args) {
			int number[] = { 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48 };
			
			compare(number,0,number.length-1);
			p(number);
	 }
	 private static void compare(int[] number, int left, int right) {
		 if(right>left){
			 int pivotIndex = left;
		     int pivotNewIndex = partition(number,left,right,pivotIndex);
		     compare(number,left,pivotNewIndex-1);
		     compare(number,pivotNewIndex+1,right);
		 }
		
	 }
	private static int partition(int[] number, int left, int right, int pivotIndex) {
		int pivotValue = number[pivotIndex];
		swap(number,pivotIndex,right);//基数交换到最后位置
		int storeIndex = left; 
		for (int i = left; i < right; i++) {
			if(number[i]<pivotValue){
				swap(number,storeIndex,i);
				storeIndex = storeIndex+1;
			}
		}
		swap(number,right,storeIndex);
		return storeIndex;
	}
	private static void swap(int number[],int index1,int index2 ) {
		int temp = number[index2];
	    number[index2] = number[index1];
	    number[index1] = temp;
		
	}
	private static void p(int num[]) {
			StringBuilder sb = new StringBuilder(num.length);
			for (int i = 0; i < num.length; i++) {
				sb.append(num[i]);
				sb.append(" ");
			}
			System.out.println(sb.toString());
	}
}
相关文章
相关标签/搜索