思路超級簡單的快速排序,手寫快排專用。
public int partition(int[] r, int i, int j) {
int temp = r[i];
while(i < j)
{
while(i < j && r[j] > temp) {
j--;
}
if(i < j)
r[i++] = r[j];
while(i < j && r[i] <= temp) {
i++;
}
if(i < j)
r[j--] = r[i];
}
r[i] = temp;
return i;
}
public void quickSort(int r[], int i, int j) {
if(i < j) {
int cut = partition(r, i ,j);
quickSort(r, i, cut - 1);
quickSort(r, cut + 1, j);
}
}
轉自https://www.jianshu.com/p/64c2444ae9ac
並附上快速求解第k大或者是前k個小的數,模版求解。
import java.util.ArrayList;
public class Test {
public int partition(int[] r, int i, int j) {
int temp = r[i];
while(i < j)
{
while(i < j && r[j] > temp) {
j--;
}
if(i < j)
r[i++] = r[j];
while(i < j && r[i] <= temp) {
i++;
}
if(i < j)
r[j--] = r[i];
}
r[i] = temp;
return i;
}
boolean flag = false;
//遞歸調用一趟排序
public void quickSort(int r[], int i, int j, int k) {
if(flag) {
return;
}
if(i < j){
int cut = partition(r, i, j);
if(cut == k) {
flag = true;
}
quickSort(r, i, cut - 1, k);
quickSort(r, cut + 1 ,j, k);
}
}
// 求解前k小的數
public ArrayList<Integer> test1(int[] input, int k) {
if(input.length == 0 || k > input.length) {
return new ArrayList<>();
}
quickSort(input, 0, input.length - 1, k);
ArrayList<Integer> list = new ArrayList<>(k);
for(int i = 0; i < k; i++) {
list.add(input[i]);
}
return list;
}
// 第k大
public int test2(int[] input, int k) {
quickSort(input, 0, input.length - 1, k);
return input[k];
}
public static void main(String[] args) {
Test test = new Test();
// 求解前k小的數
ArrayList<Integer> list = test.test1(new int[]{1, 3, 5, 9, 6, 2}, 4);
list.forEach(System.out::println);
System.out.println("------------");
// 第k大的數
int k = 4;
int number = test.test2(new int[]{1, 3, 5, 9, 6, 2}, k - 1);
System.out.println(number);
}
}