java实现快速排序算法及其思想

可以去我的博客看详细解析与简单易懂的原理:(本人博客为个人学习心得,仅供参考)
振云博客:http://zhenyunboy.icu/?p=382](http://zhenyunboy.icu/?p=382

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);
}

}

 

posted @ 2021-01-08 18:04  振云博客  阅读(112)  评论(0编辑  收藏  举报