码迷,mamicode.com
首页 > 编程语言 > 详细

为了hadoop,苦研算法

时间:2015-08-02 21:47:31      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:

慢慢积累

先来排序

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

算法步骤:

1 从数列中挑出一个元素,称为 “基准”(pivot),

2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

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

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

技术分享
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 不做处理即可去重排序


为了hadoop,苦研算法

标签:

原文地址:http://my.oschina.net/u/1432304/blog/486714

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!