package day04;
/**
* 关于快速排序的理解
* 快速排序本质上通过一个数组划分为两个子数组,然后递归地调用自身为每一个子数组进行快速排序来实现的,即算法分为三步:
*
* 1.首先从数组中找一个基准数,然后进行分别检索
*
* 2.接下来就是排序。当第一轮排完之后就会出现左边的全是比基准数小的,右边全是比基准数大的
*
* 3.分别排序之后进入递归,然后继续重复排序操作
*/
public class Exercise_G {
private static void swap(int[] data, int i, int j) {
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
//传参的个数为三个:data数据数组,start表示从左边哪个位置开始排,end表示排到哪个位置
private static void subSort(int[] data, int start, int end) {
if (start < end){
//如果end<start则说明排序时不合法的
int base =data[start];//定义基准数
int low = start;//记录基准数的位置。从左往右检索
int high = end + 1;//定义变量high让他从右边往左边检索
//开始检索了
while (true) {
//low从左往右检索
//如果检索到比基准数小的就继续
//如果比基准数大或者相等,就停止
while (low < end && data[++low] - base <= 0)
;
//high从右往左检索
//如果检索到比基准数小的就停下
//如果比基准数大或者相等,就继续检索
while (high > start && data[--high] - base >= 0)
;
//代码走到这里,则说明两个检索都停下了,接下来就是交换两者位置的元素
if (low < high) {
swap(data, low, high);
//如果上述走不通,则退出
} else {
break;
}
}
//
swap(data, start, high);
//基准数到这里就基本归位了,左边的数据都比他小,右边的数据都比他大
//递归的方法开始继续排序左边的数据
subSort(data, start, high - 1);//从开始排序到基准数前一个元素
//递归的方法排序右边的数据
subSort(data, high + 1, end);//从基准数下一个元素开始排
}
}
//写快速排序方法
public static void quickSort(int[] data){
subSort(data,0,data.length-1);
}
public static void main(String[] args) {
/*方式一:自己输入
Scanner scan =new Scanner(System.in);
System.out.println("进入快速排序,请输入10个数:");
int []data=new int [10];
for(int i=0;i<10;i++)
{
data[i]=scan.nextInt();
}
*/
//方式二:
int[] data = { 12, -12, 10, 23, -10, -14,15, 21, 30 };
System.out.println("排序之前:" + java.util.Arrays.toString(data));
quickSort(data);
System.out.println("排序之后:" + java.util.Arrays.toString(data));
}
}
运行结果