Java普通快排和高级快排

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QQB67G8COM/article/details/89340372
package SortAlgorithm;

import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class QuickSort {
	
	/*
	 * 	快速排序:
	 * 	1.首先需要选择基准点pivot,基准点一般选择需要排序的数组的第一位
	 * 	2.设置left和right,因为全过程就需要移动left和right来查找元素来进行排序
	 *  3.一开始需要判断是否只有一位数,一位数时left=right
	 *  4.left<right时需要从right开始移动查找小于left位置的元素值赋值到left位置
	 *  5.left<right时,4步骤后需要从left开始寻找大于left位置的元素填补right位置
	 * 	6.找不到无所谓,找不到时就会left=right,照样将right位置的值赋给left位置
	 *  7.4步骤找不到情况下在5步骤中left=right,将left位置的值赋给right位置 
	 *  8.用pivot填补left位置
	 */

	public void quickSort(int[] array) {
		quickSortBody(array, 0, array.length-1);
	}
	
	private final void quickSortBody(int[] array, int left, int right) {
		if (left>= right) return;
		int i=left, j=right, pivot = array[left];
		while(i<j) {
			while(i < j && array[j] >= pivot) j--;
			array[i] = array[j];
			while(i < j && array[i] <= pivot) i++;
			array[j]=array[i];				
		}
		array[i] = pivot;
		quickSortBody(array, left, i-1);
		quickSortBody(array, i+1, right);
	}
	
	/*
	 * JDK1.8及以上
	 * Java高级快排思想:
	 *   选定基准点,然后不断的比较大小,将List分成三部分,List_left,pivot,List_right,
	 *   然后对List_left和List_right进行递归进行重复操作,最后进行流输出的时候将每个递归
	 *   体中List_left,pivot,List_right进行流合并,一边合并一边输出。
	 */
	public final List<Integer> quickSort(List<Integer> list) {
		if (list.size()<2) 
			return list;
		else {
			Integer pivot = list.get(0);//选定基准点
			//skip(n)跳过前面n个元素,跳过的第一个元素就是pivot,然后过滤出小于pivot的数
			List<Integer> less = list.stream().skip(1).filter(e -> e <= pivot).collect(Collectors.toList());
			//过滤出大于pivot的数
			List<Integer> greater = list.stream().skip(1).filter(e -> e > pivot).collect(Collectors.toList());
			return Stream.of(
					quickSort(less).stream(),
					Stream.of(pivot),
					quickSort(greater).stream()
					).flatMap(Function.identity()).collect(Collectors.toList());	
		}	
	}
	public static void main(String[] args) {
		QuickSort qSort = new QuickSort();
		int[] a = {3,2,8,4,23,45,3,67,33,22,34};
		qSort.quickSort(a);
		for(int i = 0; i < a.length;) 
			System.out.print(a[i++]+" ");
		System.out.println();
		System.out.println(qSort.quickSort(Arrays.asList(3,2,8,4,23,45,3,67,33,22,34)));
	}
}

输出结果:

2 3 3 4 8 22 23 33 34 45 67 
[2, 3, 3, 4, 8, 22, 23, 33, 34, 45, 67]

猜你喜欢

转载自blog.csdn.net/QQB67G8COM/article/details/89340372
今日推荐