快速排序
算法思想:比大小,再区分
也就是从数组中抽取出一个基准,将比基准大的放右边,小的放左边,再对左右两区重复操作,最终得到有序数组
具体也就是挖坑操作:
- 将基准数挖出形成第一个坑,
- 由后向前找比他小的数,找到后挖出此坑填到前一个坑中
- 由前向后找比他大或等于他的数,找到后也挖出此坑填到前一个坑中,
- 当从前从后两坑相遇,分出左右两个区开启新的一轮,再重复执行二三两步操作。
package com.itheima.demo1;
import java.util.Arrays;
public class MyTest {
public static void main(String[] args) {
int[] arr = {9, 8, 2, 4, 3, 0, 1, 2, 6, 7, 5};
QuickSort.quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
//首先清楚:数组排序时,由于参数传递到方法传递的是地址,所以排序操作只在数组那一块区域操作
//操作完之后打印的数组名扔指向数组所在区域,也就是打印的是排序完之后的数组
//定义一个快排序,在此类的方法中排序
}
class QuickSort {
private QuickSort() {
}
public static void quickSort(int[] arr, int start, int end) {
if (start < end) {//说明这一段数组含有两个或以上元素
int index = getIndex(arr, start, end);//此方法就是将数组以基准分为大小两区,返回的就是分区完毕后基准所在的索引
//对左边区域递归
quickSort(arr, start, index - 1);
//对右边区域进行递归
quickSort(arr, index + 1, end);
}
//执行完这三个操作之后即可得到有序序列
}
private static int getIndex(int[] arr, int start, int end) {
int x = start;
int y = end;//用两个变量接受传入值
int key = arr[x];//用基准定义传入数组的起始元素
while (x < y) {//只要数组含有两个及以上元素,就进行循环
//由后向前找比它小的数
while (x < y && key <= arr[y]) {//循环使其在x,y没遇到的时候且没找到比基准小的元素的时候,索引一直倒退,直到找到第一个比基准小的元素
y--;
}
//找到后挖出此坑填到前一个坑中
if (x < y) {
arr[x] = arr[y];
x++;//使其在这一轮从前往后比较的时候基准与其下一个元素相比,不与自身相比
}
//由前向后找比它大的数
while (x < y && key >= arr[x]) {
//循环使其在x,y没遇到并且没找到比基准数大的元素的时候,索引一直前进,直到找到第一个比基准数大的元素
x++;
}
if (x < y) {
arr[y] = arr[x];//使其下一轮从后往前比较的时候基准与上一轮填的数的上一轮的元素开始比较
y--;
}
}
arr[x] = key;
return x;
}
}