算法复习:快速排序
快速排序的基本思想是:
在待排序的n个记录中任取一个记录作为基准点,基准点一般选第1个记录。数据区间被此基准点
划分为两个部分,所有比该基准点小的数据都排在它前半部分,所有比该基准点大的数据都排在它右半部分,并
把该基准点排在这两部分中间(成为记录归位)。这个过程成为一趟快速排序。然后对基准点左,右两个部分分别重复上述
操作,直到每部分只有一个记录为止。
这个思想再简而言之就是:每趟排序使表中的某一个元素(基于某种标准算出的基准点)放入到适当的位置,将表一分为二,
对于子表按递归方式继续这种划分,直至划分的子表长度为1.
下面的这段动画演示了{3,6,5,9,7,1,8,2,4}这组数据快速排序的全过程:
代码实现(Java)如下:
public class QuickSort { public static int[] quickSort(int[] arr, int start, int end) { if (start < end) { // 确保区间内有一个以上元素 // 设定一个基准值,这个基准值的选择其实也可以好好考究,为了突出快排的核心算法,就选择区间的第一个数 int temp = arr[start]; int i = start; int j = end; while (i < j) { while (i < j && arr[j] >= temp) {// 从区间两端交替向中间扫描,直到i==j为止 j--; // 从右到左扫描比基准值小的数 } arr[i] = arr[j];// 将比基准值小的数移到左端 while (i < j && arr[i] <= temp) { i++;// 从左到右扫描比基准值大的数 } arr[j] = arr[i];// 将比基准值大的数移到右端 } arr[i] = temp;// 记录归位 quickSort(arr, start, i - 1);// 对基准点的左半部分进行排序 quickSort(arr, i + 1, end);// 对基准点的右半部分进行排序 } return arr; } public static void main(String[] args) { int[] arr = { 2, 1, 3, 7, 8, 6, 5, 9, 4 }; int[] arr1 = quickSort(arr, 0, arr.length - 1); for (int i = 0; i < arr1.length; i++) { System.out.println(arr1[i]); } } }
作者:
Chris Wang
出处:
http://chriswang.cnblogs.com/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。