爲了hadoop,苦研算法

慢慢積累 java

先來排序 算法

快速排序使用分治法(Divide and conquer)策略來把一個串行(list)分爲兩個子串行(sub-lists)。 ide

算法步驟: code

1 從數列中挑出一個元素,稱爲 「基準」(pivot), 排序

2 從新排序數列,全部元素比基準值小的擺放在基準前面,全部元素比基準值大的擺在基準的後面(相同的數能夠到任一邊)。在這個分區退出以後,該基準就處於數列的中間位置。這個稱爲分區(partition)操做。 遞歸

3 遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。 get

遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,可是這個算法總會退出,由於在每次的迭代(iteration)中,它至少會把一個元素擺到它最後的位置去。 it

package com.james.sort;

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

/**
 * 快速排序分治法
 * @author james
 * jdk1.6
 */
public class DivideAndConquer {
	public static void main(String[] args) {
		Integer[] arrays = {3,2,5,8,6,1,4,4,0,11,33,22,22,11};
		List<Integer> array = Arrays.asList(arrays);
		array = sort(array);
		System.out.println(Arrays.toString(array.toArray()));
	}
	
	/**
	 * 分區排序
	 * @param array
	 */
	public static List<Integer> sort(List<Integer> array){
		if(array.size() == 0){
			return array;
		}
		int pivot = array.get(array.size() -1);
		System.out.println("pivot:" + pivot);
		List<Integer> tempPre = new ArrayList<Integer>(Math.round((array.size() / 2)));
		List<Integer> tempSuf = new ArrayList<Integer>(Math.round((array.size() / 2)));
		List<Integer> tempMid = new ArrayList<Integer>();
		for(int i = 0; i < array.size() ; i ++){
			if(array.get(i) < pivot){
				tempPre.add(array.get(i));
			}else if(array.get(i) > pivot){
				tempSuf.add(array.get(i));
			}else{
				tempMid.add(array.get(i));
			}
		}
		tempPre = sort(tempPre);
		tempPre.addAll(tempMid);
		tempSuf = sort(tempSuf);
		tempPre.addAll(tempSuf);
		return tempPre;
	}
	
	
}
//輸出結果
[0, 1, 2, 3, 4, 4, 5, 6, 8, 11, 11, 22, 22, 33]

若是須要去重排序,去除temoMid 不作處理便可去重排序 io

相關文章
相關標籤/搜索