import java.util.Arrays;
import java.util.Random;
/*
* 快速排序的简单实现
* 由于是第一次写这个,不知道怎么制作动图,
* 所以读者自行画图,我尽量把注释写的白话文一点
*/
public class QuickSort {
public static void main(String[] args) throws Exception{
//任何程序都要做各种输入的判断,异常输入的判断
//但是这里就不用了,我们为了简化,数组已经给出,而不是让用户手动输入
long arr[] = new long[10000] ;
//产生100个随机数
Random rd = new Random();
for(int i=0;i<arr.length;i++){
arr[i] = rd.nextInt(10000000);
}
System.out.println(Arrays.toString(arr));
//这里的end下标要减一,因为arr.length是数组长度,如果不减一,下面的函数会地址越界
System.out.println(Arrays.toString(quickSort(arr,0,arr.length-1)));
}
public static long[] quickSort(long[] arr, int begin, int end) throws Exception{
if(end>begin)//这是递归的出口,如果没有这句话,程序不结束的,导致会报栈溢出错误
{
//这里开始调用下面的函数使用分治的思想进行排序,
//partition方法把数组以基准的数分成 2部分,但这2部分还是无序的,所以对着2部分再调用partition的函数继续排序,
//这样反复,就能使原数组有序了
int position = partition(arr,begin,end);
quickSort(arr,begin,position-1);
quickSort(arr,position+1,end);
}
return arr;
}
//此函数就是一次(一趟)排序的函数,让数组根据中枢分成2部分,一边全部比中枢大,一边全部比中枢小
//即此函数执行一次,参数的数组就会被分成2部分,但是2部分各自都是乱的(一般是,因为要用分治的思想去对着2部分各自在做这个函数的操作)
public static int partition(long[] arr2, int begin, int end){
long temp = arr2[begin]; //一般使用数组的第一个元素作为中枢(中枢就是比较对象,所有的数都和这个数比较)
while(end>begin){
//中枢是在begin这边选的,所以要从end那边开始和中枢比较
while(end>begin && arr2[end]>=temp) //如果end那边一直大于中枢,就比较下一个
end--;
arr2[begin] = arr2[end]; //如果不大于,就把此值赋给begin,让从begin这头和中枢比较,
//从begin的下一个开始比较,因为begin那个值已经被end覆盖了
//他的原始值保存在temp中,不用担心他会丢失,因为temp中的就是中枢
while(end>begin && arr2[begin]<temp) //从另一头 的循环是相同的道理
begin++;
arr2[end] = arr2[begin];
}
//最后把中枢赋给begin(此时begin和end是一个位置,否则不会跳出循环)的位置
arr2[begin]=temp;
//返回最后begin和end停留的位置(即最后中枢的位置),是为了继续调用partition函数时使用
return begin;
}
}
快速排序
最新推荐文章于 2024-09-25 13:16:18 发布