Java版快速排序
1.快速排序的简单介绍
快速排序(Quicksort)是对冒泡排序的一种改进。
基本思想是:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行(本文用递归解决),以此达到整个数据变成有序序列。
2.快速排序思路示意图
3.本文代码的思路
- 确定标准值temp(本文的标准值为数组的第一个元素),左指针left(用i的变化表示移动)和右指针right(用j的变化表示移动).
- 设置大循环(条件为i<j),大循环内设置两个小循环,一个循环代表右指针right的移动(从arr.length-1开始用j表示),一个循环代表左指针left的移动(从0开始用i表示), 如果当前索引值代表的元素值小于标准值并且i<j,i指针就往右移(循环,不用交换);同理,i<j,j右指针往左移(循环).
- 当在i右移,j左移并且i和j不相等没遇到时,如果发现i指针代表元素值大于标准值;同理,j指针代表元素值小于标准值,那么两个循环停止,如果当前循环遍历到的值i<j,那么就要交换值(即arr[i]<=>arr[j] )之后一直循环,直到当i==j,那么代表这一轮循环结束了.
- 开始重新定义left和right和标准值(即arr[left]=arr[i] ,arr[i]=temp(标准值),就是标准值temp真的往中间放(这里中间的定义是i==j的地方), 把原来在这个位置的元素放到arr[0]中去当做标准值),在开始分左边和右边的数组进行递归(即左数组quickSort(arr,0,i-1), 右数组 quickSort(arr,i+1,arr.length-1)),一直到左数组和右数组中需要排序的元素只有一个(即left<=right),那么整个排序结束.
4.代码
package Sort;
import java.util.Arrays;
/**
* @author zh
* @ClassName : Sort.QuickSort
* @Description :快速排序
* Created by user on 2021-07-20 20:17:25
* Copyright 2020 user. All rights reserved.
*/
public class QuickSort {
static int[] arr;
/**
* 快速排序
* @author zh
* @date 2021/7/20 20:18
* @param arr:数组
* @param left:左边索引(0开始)
* @param right:右边索引(arr.length-1开始)
**/
public static void quickSort(int[] arr,int left,int right)
/*当left>=right说明该数组只剩一个元素了,没必要排序,排序结束*/
if (left>=right){
return;
}
/*存储左边索引*/
int i=left;
/*存储右边索引*/
int j=right;
/*存储标准比较值,每次都是最左边的元素*/
int temp = arr[left];
while (i<j){
/*右边进行遍历,当i<j并且当前索引值比标准值大,j指针左移*/
while (i<j&&arr[j]>=temp){
j--;
}
/*左边开始遍历,当i<j并且当前索引值比标准值小,i指针右移*/
while (i<j&&arr[i]<=temp){
i++;
}
/*当程序走到这里并且i<j时,说明上面的两个循环各自有一个索引值不满足条件,导致循环终止,
那么这时候就可以将两个值进行交换*/
if (i<j){
/*这里由于不想再定义一个临时变量,所以用位运算^异或运算进行交换值*/
arr[i]=arr[i]^arr[j];
arr[j]=arr[i]^arr[j];
arr[i]=arr[i]^arr[j];
}
}
/*最后将原来的标准值和当前的i==j索引值进行交换,让arr[i]不进行下一轮的排序*/
arr[left]=arr[i];
arr[i]=temp;
/*进行递归排序左数组*/
quickSort(arr,left,i-1);
/*进行递归排序右数组*/
quickSort(arr,i+1,right);
}
public static void main(String[] args) {
arr=new int[10];
for (int i = 0; i < 10; i++) {
arr[i]= (int) (Math.random()*10+1);
}
System.out.println("排序前数组"+Arrays.toString(arr));
quickSort(arr,0,arr.length-1);
System.out.println("排序后数组"+Arrays.toString(arr));
}
}