基本思想
假设用户输入了如下数组:
首先,定义基准pivot
为数组首个字,两个指针left
和right
然后right
向左移,遇到大于等于pivot
的数字跳过,知道遇到小于pivot
的数字,停止移动,将改数字放到left
的位置
然后left
向右移,遇到小于等于pivot
的数字跳过,直到遇到大于pivot
的数字,停止移动,将改数字放到right
的位置
循环操作,直到left>=right
,循环停止,
将pivot
中的数据赋值给array[left]
,以pivot
中的数据位置为界限,分成两个数组,继续递归
代码实现
import java.util.Arrays;
public class Qsort {
public static void main(String[] args) {
int[] a={6,2,7,3,8,9};
sort(a,0,a.length-1);
System.out.println(Arrays.toString(a));
}
/**
快速排序算法
*/
public static void sort(int[] a, int left, int right)
{
//如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了
if(left >= right)
{
return ;
}
int i = left;
int j = right;
int key = a[left];
/*控制在当组内寻找一遍*/
while(i < j)
{
while(i < j && key <= a[j])
/*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升
序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/
{
//向前寻找
j--;
}
a[i] = a[j];
/*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是
a[left],那么就是给key)*/
while(i < j && key >= a[i])
/*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
{
i++;
}
a[j] = a[i];
}
/*当在当组内找完一遍以后就把中间数key回归*/
a[i] = key;
/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
sort(a, left, i - 1);
/*用同样的方式对分出来的右边的小组进行同上的做法*/
sort(a, i + 1, right);
/*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
}
}