随机快排
import java.util.Random;
public class QuickSort {
private int[] arr;
public QuickSort(int[] a) {
this.arr = a.clone();
}
public void sort() {
_sort(0, arr.length - 1);
}
private void _sort(int left, int right) {
if (left >= right) {
return;
}
int mid = partition(left, right);
_sort(left, mid - 1);
_sort(mid + 1, right);
}
/**
* 随机找出一个数mid作为中间值
* 将arr中下标范围[left, right]内的元素分为两部分
* 左侧均比不大于mid, 右侧均不小于mid
*
* @param left 起始下标
* @param right 终止下标
* @return 中间值mid的下标
*/
private int partition(int left, int right) {
int index = new Random().nextInt(right - left + 1) + left;
int temp = arr[index];
arr[index] = arr[left];
arr[left] = temp;
int mid = arr[left];
while (left < right) {
while ((left < right) && (arr[right] >= mid)) {
--right;
}
arr[left] = arr[right];
while ((left < right) && (arr[left] <= mid)) {
++left;
}
arr[right] = arr[left];
}
arr[left] = mid;
return left;
}
public void print() {
for (int i : arr) {
System.out.print(i + " ");
}
System.out.println();
}
public static void main(String[] args) {
QuickSort q = new QuickSort(new int[]{56, 645, 43, 343, 55, 546, 43, 65, 6, 43, 5, 64, 4, 35, 6});
q.sort();
q.print();
}
}
第k小的数
import java.util.*;
public class Finder {
private final int SCOPE = 128;
public int findKth(int[] a, int n, int K) {
return maxK(a, 0, n - 1, K);
}
/**
* 在数组arr下标范围[left, right]之间找到第k大的数
*
* @param arr 数组
* @param left 起始下标
* @param right 终止下标
* @param k 索引值, 从1开始
* @return
*/
private int maxK(int[] arr, int left, int right, int k) {
if (left > right) {
return -1;
}
// 小范围可以不再分治, 直接排序
if (right - left + 1 <= SCOPE) {
Arrays.sort(arr, left, right + 1);
return arr[left + k - 1];
}
int mid = partition(arr, left, right);
int index = mid - left + 1;
if (index > k) {
return maxK(arr, left, mid - 1, k);
} else if (index < k) {
return maxK(arr, mid + 1, right, k - index);
}
return arr[mid];
}
/**
* 随机找出一个数mid作为中间值
* 将arr中下标范围[left, right]内的元素分为两部分
* 左侧均比不大于mid, 右侧均不小于mid
*
* @param arr 数组
* @param left 起始下标
* @param right 终止下标
* @return 中间值mid的下标
*/
private int partition(int[] arr, int left, int right) {
int index = new Random().nextInt(right - left + 1) + left;
int temp = arr[index];
arr[index] = arr[left];
arr[left] = temp;
int mid = arr[left];
while (left < right) {
while ((left < right) && (arr[right] <= mid)) {
--right;
}
arr[left] = arr[right];
while ((left < right) && (arr[left] >= mid)) {
++left;
}
arr[right] = arr[left];
}
arr[left] = mid;
return left;
}
public static void main(String[] args) {
Finder finder = new Finder();
System.out.println(finder.findKth(new int[]{3, 4, 5, 6, 2, 1, 7, 8, 9}, 9, 2));
}
}
相关题目