public class QuickSort {
public static void quickSort(Integer[] arr, int low, int height) {
/***
* j先从右往左找一个小于6的数,i再从左往右找一个大于6的数,然后交换他们。
* 这里可以用两个变量i和j,分别指向序列最左边和最右边。我们为这两个变量起个好听的名字“哨兵i”和“哨兵j”。
* 刚开始的时候让哨兵i指向序列的最左边(即i=1),指向数字6。让哨兵j指向序列的最右边(即=10),指向数字。
* 基准数是 [6]
* i=1 j=10
* 6 1 2 7 9 3 4 5 10 8
*
* j先出动 向左移动j-- ,i向右移动i++ 直到找到一个数大于6的数停下来。最后哨兵j停在了数字5面前,哨兵i停在了数字7面前。交换位置
* 6 1 2 7 9 3 4 5 10 8
*
* 6 1 2 [5] 9 3 4 [7] 10 8
*
* 6 1 2 5 [4] 3 [9] 7 10 8
*
* j先走走到3, i走到3 交换基准数
*
* 6 1 2 5 [4] 3 [9] 7 10 8
*
* [3] 1 2 5 4 [6] 9 7 10 8
*
* 快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,
* 将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边
* 序列以3为基准数进行调整,使得3(基准数)左边的数都小于等于(基准数)3,3(基准数)右边的数都大于等于(基准数)3
* (1 2 [3] 5 4)
*/
// temp 作为基准数 t为中间交换赋值
int i, j, temp, t;
if (low > height) {
return;
}
i = low;
j = height;
// temp作为基准数
temp = arr[low];
while (i < j) {
//先看右边,依次往左递减 j--(基准数右边)
while (temp <= arr[j] && i < j) {
j--;
}
// 再看左边 依次向右递增 i++ (基准数左边)
while (temp >= arr[i] && i < j) {
i++;
}
//如果满足条件则交换
if (i < j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low]=arr[i];
arr[i]=temp;
//递归调用左半数组
quickSort(arr, low, j-1);
//递归调用右半数组
quickSort(arr, j+1, height);
}
public static void main(String[] args){
Integer[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
quickSort(arr, 0, arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
快速排序--
最新推荐文章于 2024-11-12 21:59:57 发布
本文详细介绍了快速排序算法的工作原理,通过一个具体的例子展示了如何选取基准数并进行数组调整的过程。快速排序通过设置基准点,将数组分为两部分,确保基准点左边的元素都小于等于基准点,右边的元素都大于等于基准点,从而达到排序的目的。文章还提供了Java代码实现,并进行了递归调用来完成整个数组的排序。
摘要由CSDN通过智能技术生成