快速排序:
分治算法 分半 找到一个中间值
key
13 45 6 9 43 12 key 左边的 都比key 小 右边的都比key大
package com.judy.demo;
import java.util.Arrays;
public class HelloWorld {
public static void main(String[] args) {
int[] array = new int[]{49, 38, 65, 97, 76, 13, 27, 49};
//调用排序方法,这里只要传进最开始的数组即可
sort(array, 0, array.length - 1);
}
//第二步 定义排序的方法,
public static void sort(int[] arr, int low, int high) {
//每一趟分区都会指定到一个新key的下标,所以要递归调用排序方法
if (low < high) {
int mid = partition(arr, low, high); //返回key的下标
sort(arr, low, mid - 1);//左边排序
sort(arr, mid + 1, high);//右边排序
}
}
//第一步先写分区方法,返回key分区完成后的当前的下标,以key做为分区线,key取数组中的一个元素
public static int partition(int[] array, int low, int high) {
//取比较的基准数
int key = array[low];
//定义循环变量
int i = low; //因为分区之后还要分区,所以这个是变化的
int j = high;
if (low < high) { //设置能执行循环的条件
while (i < j) {
while (i < j && array[j] >= key) {//先从右到左比较并移动指针
j--;
}
if (i < j) {
array[i] = array[j];
i++; //把小的值放在i位置后移动指针
}
while (i < j && array[i] <= key) {//再比较左边,并移动
i++;
}
if (i < j) {
array[j] = array[i];
j--;
}
}
System.out.println(Arrays.toString(array));
array[i] = key; //一趟分区完成之后,把key放到新的界限处,返回它的下标标记
}
return i;
}
}