? ? ? ? ?快速排序算法简单地说就是找一个基准数,比基准数大的数就放在基准数右边,比基准数小的就放在基准数左边,然后分别对基准数左边的序列后右边的序列进行前面的步骤,直到分出来的序列长度为一。
? ? ? ? 而想要实现上面的步骤需要提取三个关键点,基准数,队首索引,队尾索引。为了方便,我们每次都可以以序列最左边的数作为基准数,然后队首索引和队尾索引一开始分别是序列开头位置和序列结束位置,我们可以拿队尾元素与基准数比较,比基准数大那对尾索引就向前移动,比基准数小就将这个元素插入到队首位置,之后队首索引向后移动,然后下一次比较就拿队首元素与基准数相比较了,直到找到比基准数大的数,将元素插入到队尾索引位置之后再将队尾元素向前移,一次类推,直到队首索引与队尾索引相等,就将基准数插入到队尾与队首索引相等的这个位置,这个序列内部的比较和插入就完成了,然后开始子序列的比较和插入。
public class QuickSort {
public static void main(String[] args) {
int[] arr = {99, 55, 2, 3, 9, 10, 22, 34, 67, 89, 69, 92, 101, 102};
//定义队首位置的索引
int left = 0;
//定义队尾位置的索引
int right = arr.length - 1;
sort(arr, left, right);
for (int i : arr){
System.out.println(i);
}
}
public static void sort(int[] arr, int left, int right) {
if (left < right) {
//定义基准数
int pivot = arr[left];
//记录序列的开始
int begin = left;
//记录序列的结束
int end = right;
while (right > left) {
//当队尾元素小于基准数就将队尾插到队首
if (arr[right] < pivot) {
arr[left] = arr[right];
//并将队首索引后移
left++;
} else {
//当队尾元素大于基准数就将队尾索引前移
//并继续从队尾比较
right--;
continue;
}
while (right > left) {
//当队首元素大于基准数就将队首位置插到队尾
if (arr[left] > pivot) {
arr[right] = arr[left];
//并将队尾索引前移
right--;
break;
} else {
//当队首元素小于基准数就将队首索引前移
//并继续从队首比较
left++;
}
}
}
//队首和队尾索引重合,就将基准数插入此位置
arr[left] = pivot;
sort(arr, begin, left - 1);
sort(arr, left + 1, end);
}
}
}