一、算法思想
分治法:比大小再分区
1.从数组中取出一个数作为基准数;
2.分区:将比这个数大或等于的数全部放在它的右边。小于它的数全部放在它的左边;
3.再对左右区间重复第二步,直到各区间只有一个数。
二、实现思路
1.将基准数挖出形成第一个坑;
2.由后向前找比它小的数;找到后挖出此数填到前一个坑中;
3.由前向后找比它大或等于的数,找到后挖出此数填到前一个坑中;
4.再重复2、3步。
如:
所以首先需要声明两个变量i、j 分比代表从左右两边开始比较
代码实现:
public class 快速排序 {
/**
* @param arr
* @param start 数组开始位
* @param end 数组结束位
*/
public static void quickSort(int[] arr, int start, int end) {
if (start < end) {
//index为数组分区索引位
int index = getIndex(arr, start, end);
//递归调用拆分
quickSort(arr, 0, index - 1);
quickSort(arr, index + 1, end);
}
}
/**
* 分区并返回索引值
*
* @param arr
* @param start
* @param end
* @return
*/
private static int getIndex(int[] arr, int start, int end) {
int i = start;
int j = end;
//挖第一个坑位
int x = arr[i];//x是基准数,所对应的的坑位就是第一个
while (i < j) {
//先从右向左,找数组元素比小于x的
while (i < j && arr[j] >= x) {
j--;
}
if (i < j) {
//把找到的元素存到第一个坑位
arr[i] = arr[j];
i++;
}
//从左边向右边对比,找大于等于基准数x的数
while (i < j && arr[i] < x) {
i++;
}
if (i < j) {
arr[j] = arr[i];
j--;
}
}
arr[i] = x;
return i;
}
public static void main(String[] args) {
int arr[] = {5,3,9,1,6,7,2,4,0,8};
quickSort(arr, 0, arr.length - 1);
{
for (int i : arr) {
System.out.print(i + " ");
}
}
}
}