用“填坑”的方法实现快速排序:
1、取出头部数字作为中值,形成初始坑;
2、从右边遍历取出小于或等于中值的数字填进1中形成坑;
3、再从左边遍历取出大于中值的数组填进2形成的坑;
4、重复2,3直到循环结束,把中值填回数组中,此时中值所在位置把原数组分割成两部分;
5、用递归方法对分割成的两部分进行排序。
注:2、3步骤中,与中值相等的值要么按比中值小处理,要么按比中值大处理,要么不处理,即至多只能往一个方向填坑(可以不取出填坑)
代码如下:
//快速排序:“填坑”方法,与中值相等的按小于中值处理
import java.util.Arrays;
public class QuickSort{
public static void quickSort(int[] a, int begin, int end){
if(begin >= end)
return;
//数组长度不小于2才需要排序
int low = begin;
int high = end;
int mid = a[low]; //第一个数取出作为中值,形成左坑
//把数组分为左右两部分,左边比中值小,右边比中值大
while(low < high){
//从右开始取出小于等于中值的数填左坑,形成右坑
while(low < high && a[high] > mid){
high = high - 1;
}
a[low] = a[high];
//从左开始取大于中值的数填右坑,形成新左坑
while(low < high && a[low] <= mid){
low = low + 1;
}
a[high] = a[low];
}
//第一次取出的数回填使数组完整
a[low] = mid;
//递归完成两部分排序
quickSort(a, begin, low - 1);
quickSort(a, low + 1, end);
}
//测试实例
public static void main(String[] args){
int a[] = {4, 5, 1, 9, 7, 2, 3, 6, 8};
int b[] = {1};
int c[] = {4,3};
int d[] = {4, 5, 4, 1, 2, 2, 3, 2, 8};
System.out.println("原数组a = " + Arrays.toString(a));
quickSort(a, 0, a.length - 1);
System.out.println("快排后a = " + Arrays.toString(a));
System.out.println("原数组b = " + Arrays.toString(b));
quickSort(b, 0, b.length - 1);
System.out.println("快排后b = " + Arrays.toString(b));
System.out.println("原数组c = " + Arrays.toString(c));
quickSort(c, 0, c.length - 1);
System.out.println("快排后c = " + Arrays.toString(c));
System.out.println("原数组d = " + Arrays.toString(d));
quickSort(d, 0, d.length - 1);
System.out.println("快排后d = " + Arrays.toString(d));
}
}
输出:
原数组a = [4, 5, 1, 9, 7, 2, 3, 6, 8]
快排后a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
原数组b = [1]
快排后b = [1]
原数组c = [4, 3]
快排后c = [3, 4]
原数组d = [4, 5, 4, 1, 2, 2, 3, 2, 8]
快排后d = [1, 2, 2, 2, 3, 4, 4, 5, 8]