基本思想
快速排序(QuickSort)如其名称一样,是目前是效率最高的排序算法之一。主要的核心思想如下:
设有数列
,现在对其进行重新排序,使其重新排序,满足
在
左右元素都小于等于
,而在右侧的元素都大于等于
。例如,
。由于左边的数列的元素都比
小,而右边的子数列的元素都比
大,所以可以完全独立地通过递规调用,对
左右两测的子数列进行同样的快速排序,从而使整个数序的排序完成。
图解排序过程
目前比较困难的就是理解如何高效地根据
将原数组拆分成两个子数组。现在以上面的例子为输入,有以下排序过程。在下图中,绿色箭头表示正在移动的指针,蓝色箭头表示待移动指针,黄色表示当前操作的元素。
Java 代码实现
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {1,3,5,2,4,8};
sort(arr);
System.out.println(Arrays.toString(arr));
}
static void sort(int[] ints){
sort(arr, 0, arr.length- 1);
}
/**
* 快速排序。
* @param ints 输入待排序数组。
* @param start 开始位置。
* @param end 结束位置(注:包括此位置)。
* @return
*/
static int sort(int[] ints, int start, int end)
{
if (start >= end)
return -1;
int last = ints[end];
int pvt = 0, t = 0;
for (int i = start; i <= end; i++)
{
if (ints[i] > last)
{
pvt++;
continue;
}
for (int j = 0; j < pvt; j++)
{
t = ints[i - j - 1];
ints[i - j - 1] = ints[i - j];
ints[i - j] = t;
}
}
pvt = end - pvt;
sort(ints, start, pvt - 1);
sort(ints, pvt + 1, end);
return pvt;
}
}
输出:[1, 2, 3, 4, 5, 8]