我们快速排序的图解放在下面,有一些重复的动作就省略。
java代码如下:
/**
* @author: 阿久
* 快速排序
*/
public class SnackOrder {
public static void main(String[] args) {
int[] ints = randomNumber(100);
//printSortNumber(ints);
long start = System.currentTimeMillis();
//调用方法,进行快速排序
quickSort(ints,0,ints.length - 1);
long end = System.currentTimeMillis();
System.out.println("耗费时间 = " + (end - start));
printSortNumber(ints);
}
private static int [] randomNumber(int arrNumber){
int [] arr = new int[arrNumber];
Random random = new Random();
for (int i = 0; i <arr.length; i++) {
//生成随机数
int number = random.nextInt();
arr[i] = number;
}
return arr;
}
private static void printSortNumber(int [] arr){
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
/**
* 定义方法,用来进行快速排序
* @param arr 定义一个数组
* @param left 左指针
* @param right 右指针
*/
public static void quickSort(int [] arr,int left,int right){
//进行判断,如果左边索引比右边索引大,是不合法的。直接使用return 结束这个方法
if (left > right){
return;
}
//定义变量把保存基准数
int base = arr[left];
//定义变量 i,指向最左边
int i = left;
//定义变量 j,指向最右边
int j = right;
//当i 和j 不相遇的时候,再循环中进行检索
while (i != j){
//向由j 从右往左检索比基准数小的,如果检索到比基准数小的就停下。
//如果检索比基准数大的或者相等的,就继续检索
while(arr[j] >= base && i < j){
j--;//j 从右往左移动
}
//i 从左往右检索
while (arr[i] <= base && i < j){
i++;//i 从左往右移动
}
//代码走到这里。i停下了,j也停下来链路,然后交换i 和 j 位置的元素
swap(arr,i,j);
}
//如果上面while 循环的条件不成立,会跳出这个循环,往下执行。
//如果这个条件不成立说明 i 和 j 相遇了
//如果i 和 j 相遇了,就交换了基准数这个元素和相遇位置的元素
//把相遇位置的元素赋值给基准数这个位置的元素
arr[left] = arr[i];
//把基准数赋值给相遇位置的元素
arr[i] = base;
//基准数在这里就归位了,左边的数字都比它小,右边的数字都比它大
//排基准数的左边
quickSort(arr,left,i-1);
//排基准数的右边
quickSort(arr,j + 1,right);
}
private static void swap(int [] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
希望能帮助到大家!记得点赞和关注哟
标签:检索,arr,Java,展示,int,System,ints,排序 From: https://www.cnblogs.com/ajiu569/p/16750663.html