/*最近在研究一些数据结构和算法,上网搜了一下快速排序算法,发现好多写的都是滥造的坨状物,所以自己动手实现了一版*/
package org.cuijch.study.math;
/**
* Created by Administrator on 2016/5/27
* Java 实现快速排序.
*/
public class QuickSort {
public static void main(String[] args) {
long[] arr = {20, 99, 39, 80, 65, 100, 34, 75, 36, 71};
printArr(arr);
quickSort(arr, 0, arr.length - 1);
printArr(arr);
}
/**
* 快速排序算法
*
* @param arr 要操作的数组
* @param left 数组左边角标
* @param right 数组右边角标
*/
public static void quickSort(long[] arr, int left, int right) {
if (left < right) {
int partition = partitionIt(arr, left, right, arr[right]);
quickSort(arr, left, partition - 1);
quickSort(arr, partition + 1, right);
}
}
/**
* 先些一个划分算法实现
*
* @param arr 要操作的数组
* @param lower 数组最左边角标
* @param upper 数组最右边角标
* @param povit 中间值
* @return 临界点角标
*/
public static int partitionIt(long[] arr, int lower, int upper, long povit) {
int lowerPtr = lower - 1;
int upperPtr = upper; // 因为要把数组最后一个元素作为中间值
while (true) {
while (lowerPtr < upper && arr[++lowerPtr] < povit) ;// 小于就循环找出大于中间值的
while (upperPtr > lower && arr[--upperPtr] > povit) ;// 大于就循环找出小于中间值的
if (lowerPtr >= upperPtr) break;
swap(lowerPtr, upperPtr, arr);
}
swap(lowerPtr, upper, arr);
return lowerPtr;
}
private static void swap(int one, int two, long[] arr) {
long tmp = 0;
tmp = arr[one];
arr[one] = arr[two];
arr[two] = tmp;
}
public static void printArr(long[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
}