快速排序在内部排序方法中效率较高,一般为O(n*logn),当数组有序的时候效率达到最低O(n*n),快速排序采用分治策略。
基本思想是:1、先从数组中取出一个数为基准值; 2、将数组中的比基准值大或等于的放到基准值右边,小于基准值的全部放到基准值左边; 3、再对左右区间重复2步骤,直到区间只有一个数。
快速排序有递归实现和非递归实现两种方式;
一、递归实现:
package csu.practice;
import java.util.Arrays;
import java.util.Random;
public class quickSort {
public int Partition(int[] arr, int i, int j) {
int pivotValue = arr[i]; //记录基准值,arr[i]就是挖的第一个坑
while (i < j) {
while (i < j && arr[j] >= pivotValue) { //从右向左查找小于基准值pivotValue的数
j--;
}
arr[i] = arr[j]; //将找到的小于pivotValue的数放在 基准值的位置上,将arr[j]填到arr[i]坑中,并挖了一个新坑arr[j]
while (i < j && arr[i] <= pivotValue) { //从左向右找大于基准值的数
i++;
}
arr[j] = arr[i]; //将找到的大于基准值的数放在之前上步从右向左找到的小于pivotValue数的位置上,将arr[i]填到arr[j]坑中,并形成新坑arr[i]
}
//当i=j时,划分区间完成 将pivot放在arr[i]上,也是pivotValue的最终位置
arr[i] = pivotValue;
return i; //返回基准值的位置
}
public void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pivotPos = Partition(arr, low, high);// 划分区间
quickSort(arr, low, pivotPos - 1); //递归调用
quickSort(arr, pivotPos + 1, high); //递归调用
}
}
public static void main(String[] args) {
Random ran = new Random();
int[] arr = new int[20];
for (int i = 0; i < 20; i++) {
arr[i] = ran.nextInt(100);
}
System.out.println(Arrays.toString(arr));
quickSort qs = new quickSort();
qs.quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
}
二、非递归实现(待续)