慢慢积累 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