快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序 过程可以递归进行,以此达到整个数据变成有序序列。
排序原理:
1、首先设定一个分界值,通过该分界值将数组分成左右两部分。
2、将大于或等于分界值的数据放到到数组右边,小于分界值的数据放到数组的左边。
3、重复上述过程,通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当 左侧和右侧两个部分的数据排完
序后,整个数组的排序也就完成了。
-- 原理图:
-- API设计
-- 切分原理:
1、找一个基准值,用两个指针分别指向数组的头部和尾部。
2、先从尾部向头部开始搜索一个比基准值小的元素,搜索到即停止,并记录指针的位置。
3、再从头部向尾部开始搜索一个比基准值大的元素,搜索到即停止,并记录指针的位置。
4、交换当前左边指针位置和右边指针位置的元素。
5、重复2,3,4步骤,直到左边指针大于右边指针停止。
-- 切分原理图:
-- 代码:
/**
* 快速排序
*/
public class Quick {
// 对数组a中的元素进行排序
public static void sort(Comparable[] a) {
int lo = 0;
int hi = a.length - 1;
sort(a,lo,hi);
}
// 对数组a中lo到hi的元素进行排序
public static void sort(Comparable[] a,int lo,int hi) {
if(hi <= lo) {
return;
}
// 对数组a中lo到hi之间的元素进行切分
int p = partition(a,lo,hi);
// 对左子组进行排序
sort(a,lo,p - 1);
// 对右子组进行排序
sort(a,p + 1,hi);
}
// 对数组中lo到hi的元素进行切分
private static int partition(Comparable[] a,int lo,int hi) {
Comparable key = a[lo]; // 将分组中最左边的元素定位基准值
int left = lo; // 定义一个左侧指针,初始化指向最左侧的元素
int right = hi + 1; // 定义一个右侧指针,初始化指向右侧元素的下一个
// 进行切分
while(true) {
// 从右往左扫描找到一个比基准值小的元素
while(less(key,a[--right])) {
if(right == lo) {
break; // 扫描到最左侧无需扫描
}
}
// 从左往右扫描找到哟个比基准值大的元素
while(less(a[++left],key)) {
if(left == hi) {
break; // 扫描到最左侧无需扫描
}
}
// 如果两个指针相遇跳出循环
if(left >= right) {
break;
}else {
// 否则交换两个元素的值
exch(a,left,right);
}
}
// 最后交换right处与基准值处的索引
exch(a,lo,right);
// right就是切分线
return right;
}
//数组元素i和j交换位置
private static void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
// 比较v元素是否小于w元素
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
}
-- 测试代码:
public class QuickTest {
public static void main(String[] args) throws Exception {
Integer[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 8};
Quick.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
-- 运行效果图:
@ 以上内容属于个人笔记