快速排序
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
举例(填坑法)
算法描述:给定一个数组array,有6个元素,i表示数组开始下标i=0,j表示数组的最大下标,j=5.
首先选择一个数字作为基数,然后先最后一个数字与基数比较,当数字大于基数时,再选择倒数第二位与基数比较,直到遇到一个数字比基数小(如果没有遇到说明这个序列已经排好了),将这个数字赋值给基数那个位置(array[0]),同时i+1,然后从i+1的开始与基数比较,如果数字小于基数,i右移,直到遇到比基数大的数字,把当前数字赋值个array[j],
循环执行上面两步(一次左移结束和一次右移结束为一个循环),
i右移和j左移的过程中始终保持i<j,当i=j时这一轮比较结束,产生两个待排序的序列 下标0->i-1 和下标 i+1->5,递归执行上面的步骤。
待排序列 6 2 7 3 9 8
选择一个数字作为基数,这里选择6 :
x 2 7 3 9 8 (x代表坑) i = 0 j = 5 <---
先从右往左分别与6比较,当遇到3的时候, 3 < 6;用3填坑,原来3的位置变成了坑
3 2 7 x 9 8 左移结束 i = 1 j = 3 右移
3 2 x 7 9 8 右移结束 i = 2 j = 3 - 1 i = j 用基数6填坑
3 2 6 7 9 8 此时 6左边的数字都比6小,有边上的数字都比6大,
于是产生了两个序列需要排序【3, 2】【7, 9 ,8】,对这两个序列用上面的方法排序。
public class QuickSort { public int[] sort(int[] array, int start, int end){ int i = start; int j = end; int base = array[start]; while (i != j){ while (array[j] >= base && j > i){ j--; } if (i < j){ array[i] = array[j]; i++; while(array[i] <= base && i < j){ i++; } if (i < j){ array[j] = array[i]; } } } array[i] = base; //基数填坑 if (start < i - 1){ sort(array, start, i - 1); } if (j + 1 < end){ sort(array, j + 1, end); } return array; } public static void main(String[]args){ QuickSort quickSort = new QuickSort(); int[] arr = new int[]{3, 7,4,6,9,2,5}; arr = quickSort.sort(arr,0,arr.length - 1); for (int i : arr ) { System.out.println(i + ","); } } }

浙公网安备 33010602011771号