快速排序详解

来源:互联网 发布:贾平凹秦腔读后感知乎 编辑:程序博客网 时间:2024/05/02 05:01
import java.util.Scanner;public class Main{public static void main(String[] args){int n = (int)(Math.random() * 100);int a[] = new int [n];for(int i=0; i<n; i++){a[i] = (int)(Math.random() * 200);}quickSort(a, 0, n-1);for(int i=0; i<n; i++){System.out.print(a[i]+" ");}}/** * 快速排序 * 原理:选取首元素作为基准元素,从右向左找比基准元素小的(右标兵),从左往右找比基准元素大的(左标兵),然后交换这俩元素。直到左右标兵相遇。 *     最后将基准元素放在左右标兵相遇的位置。这样就实现了在基准元素左边的值都比其小,基准元素右边的值都比其大。这样递归下去直到待排序数组中只要一个值。 * @param a 待排序数组 * @param l待排序数组的起始下标 * @param r 待排序数组的末尾下标 */public static void quickSort(int a[], int l, int r){if(l>=r)return;//pl, pr 就是左右标兵int pl = l, pr = r;//***********************************************//在数组中随机选择一个元素与a[l]交换,作为基准元素。这样做可以尽量避免最坏情况。int randomInt = (int)(Math.random()*(r-l)) + l;if(randomInt != l){//交换a[randomInt] 和  a[l]的值,只能在俩元素不是同一个元素的时候才能用异或交换。a[randomInt] = a[randomInt] ^ a[l];a[l] = a[randomInt] ^ a[l];a[randomInt] = a[randomInt] ^ a[l];}//************************************************//key是基准元素, 因为此处已经记录了a[l],所以接下来可以把a[l]看作一个空的盒子。(感觉这种做法非常6)int key = a[l];while(pl < pr){//这个while循环是 直到 左右标兵相遇。(因为可能不止交换一次)while(pl<pr && a[pr]>=key)pr--;//右标兵从数组右边往左边找比基准元素小的值。a[pl] = a[pr];//把比基准元素小的a[pr]放入空盒子中,此时a[pr]可以看作空盒子。while(pl<pr && a[pl]<=key)pl++;//左标兵从数组左边往右边找比基准元素大的值。a[pr] = a[pl];//把比基准元素大的a[pl]放入空盒子中,此时a[pl]可以看作空盒子。}a[pl] = key;//这时候左右标兵相遇了,在标兵左边的元素都比基准元素小,在标兵右边的元素都比基准元素大。此时把基准元素放在标兵的位置上。//可以看到这些赋值 a[pl] = a[pr]; a[pr] = a[pl]; a[pl] = key; 都是把值往空盒子里装,并没有丢失信息。quickSort(a, l, pl-1); //递归的排序 基准元素左侧的区间quickSort(a, pl+1, r); //递归的排序基准元素右侧的空间}}

0 0
原创粉丝点击