算法思想
1、假设将数组划分为r[low],r[low+1],…,r[high],默认temp=arr[low]为基准记录,此时r[low]相当于空单元。
2、high从右向左扫描,知道r[high]<temp时,将r[high]移动到空单元r[low],此时r[high]相当于空单元。
3、low从左向右扫描,知道r[low]>temp时,将r[low]移动到空单元r[high],此时r[low]相当于空单元。
4、当low和high相遇时,r[low] (或r[high])相当于空单元,且r[low]左边的关键字全部小于基准记录temp记录的关键字,r[high]右边的关键字全部小于基准记录temp记录的关键字,最后将基准记录temp移至r[low]中,就完成一次快速排序过程。
5、采用递归,对temp左边的子表和右边的子表采用同样的方法进行一步划分。
代码
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {48, 62, 35, 77, 55, 14, 35, 98};
QKSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
// 完整的快速排序算法
public static void QKSort(int[] arr, int low, int high) {
if (low < high) {
// 调用一趟快速排序算法,以枢轴元素为界划分两个子表
int pos = oneQKsort(arr, low, high);
// 对左部子表快速排序
QKSort(arr, low, pos - 1);
// 对右部子表快速排序
QKSort(arr, pos + 1, high);
}
}
// 一趟快速排序算法,low和high分别为坐下标和右下标
public static int oneQKsort(int[] arr, int low, int high) {
// 定义一个基准记录(标兵),默认数组第一个
int tem = arr[low];
while (low < high) {
//从右到左找到小于基准记录的值
while (low < high && arr[high] >= tem) {
high--;
}
//找到小于基准记录的值,则送人“空单元”r[low]
if (low < high) {
arr[low] = arr[high];
low++;
}
//从左到右找到大于基准记录的值
while (low < high && arr[low] < tem) {
low++;
}
//找到大于基准记录的值,则送人“空单元”r[high]
if (low < high) {
arr[high] = arr[low];
high--;
}
}
arr[low] = tem; //将基准记录的值保存到low = high的位置
return low; //返回基准记录的值
}
}
输出结果
稳定行:不稳定,反例{3,3,2}