可以去我的博客看详细解析与简单易懂的原理:
振云博客:http://zhenyunboy.icu/?p=382
java编程源码展示:
public class fast {
public static void main(String[] args) {
int a[] = { 1, 5, 9, 6, 8, 2, 3, 7, 10 };
que(a, 0, a.length - 1);
for (int i : a) {
System.out.print(i + " ");
}
}
/**
* 快速排序 空间复杂度也为O(logn) O (nlogn)
*/
public static void que(int array[], int left, int righ) {
//如果传入进来的左参数left(从左往右数第一个)大于右参数righ(最后一个)
//在这里就直接返回
if (left > righ) {
return;
}
// 定义一个基本数,也就是接下来要和每一个参数对比的基本元素
int base = array[left];
//定义初始化i的位置,也就是从哪里开始向右移动
int i = left;
//定义初始化j的位置,也就是从哪里开始向左边移动
int j = righ;
// i和j移动,
// i向右移动找出数组元素大于基本数base,j向左边移动数组元素小于基本数base,直到相等循环停止
//在i和j移动的过程中没有相遇时就一直循环,直到相遇为止
while (i != j) {
// j向左边移动,只有当元素大于等于基本数,j才左移
while (array[j] >= base && i < j) {
//j从右边向左边移动
j--;
}
// i向右移,只有当元素小于等于基本数,i才右移
while (array[i] <= base && i < j) {
//i从左边向右边移动
i++;
}
// 当移动停止说明找到了该元素,就交换位置
int temp = 0;
//将下标为i的元素给temp中间值
temp = array[i];
//将下标为j的元素给下标为i的位置,注意此时i位置是空值
array[i] = array[j];
//将中间值赋值给下标为j的位置,也就是将i位置的值与j位置的值互换
array[j] = temp;
}
// 当i和j第一次相遇就说明快速排序第一次完成
// 就将最左边的基本数和当前ij相遇位置的元素交换
// *********************************************************
//相遇一次后此时i=j所处位置一样,该位置的值要给到最左边位置上,也就是
//将i或j位置上的值给到首位置上
array[left] = array[i];
//再将基本值,也就是全程与之比较的值给到i或者j的位置
array[i] = base;
// *********************************************************
// 到这里后base左边元素全部小于base,右边全部大于base;
// 所有左边再次排序,递归
que(array, left, i - 1);
// 右边再次排序,递归
que(array, i + 1, righ);
}
}
https://www.bilibili.com/video/BV1it41167v2?from=search&seid=8723510032926362054