一、基本思路
选一个元素作为基准值,一般选第1个元素。小于基准值的放在基准值的左边,大于基准值的放在基准值的右边,排好后,再把基准值两边的序列分别进行上述步骤,直到排序结束。
二、算法实现
选择数组的第一个元素作为基准元素,并把元素存在temp变量中定义right索引从后往前比较,把比temp小的放到左边。定义left索引从前往后比较,把比 temp大的放到右边。直到left和right重合,把temp值放到left与right的重合位置,结束一次循环。此时,temp左边都比temp小,右边都比temp大,但是确是无序的,此时我们再将左右两边的序列重新选择基准值,重复上面的操作,直到排序完成即可。
三、简单代码实现
package com.xcx.blog;
/**
* @author 作者 : X-LEFT
* @version 创建时间:2019年11月15日 下午11:14:36
*/
public class QuickSort {
public static void main(String[] args) {
int[] a = { 12, 20, 5, 16, 15, 8, 30 };
System.out.println("原数组为:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();//换行
//调用快速排序方法
quickSort(a, 0, a.length - 1);
System.out.println("快速排序后的数组为:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
public static void quickSort(int a[], int left, int right) {
if(left>=right||a==null||a.length<=1)
return ;
int i = left;
int j = right;
int temp = a[left]; // 将第一个数作为基准数存入temp中
while (i < j) {
while (i < j && a[j] > temp) // 从右往左开始扫描,大于temp,j--
j--;
if (i < j) { // 找到小于temp的,将它填入上一个坑中,i++
a[i] = a[j];
i++;
}
while (i < j && a[i] < temp)// 从右往左开始扫描,小于temp,i++
i++;
if (i < j) {
a[j] = a[i]; 找到大于temp的,将它填入上一个坑中,j--
j--;
}
a[i] = temp; // 最后将temp填入最后一个坑中
quickSort(a, left, i - 1); // 递归,完成左边的排序
quickSort(a, i + 1, right); // 递归,完成右一半的排序
}
}
}