排序算法之快速排序
舞蹈演示排序:
冒泡排序: http://t.cn/hrf58M
希尔排序:http://t.cn/hrosvb
选择排序:http://t.cn/hros6e
插入排序:http://t.cn/hros0W
快速排序:http://t.cn/ScTA1d
归并排序:http://t.cn/Sc1cGZ
快速排序是一个就地排序,分而治之,大规模递归的算法。从本质上来说,它是归并排序的就地版本。
1、快速排序可以由下面四步组成:
(1) 如果不多于1个数据,直接返回。
(2) 一般选择序列最左边的值作为支点数据。
(3) 将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。
(4) 对两边利用递归排序数列。
快速排序比大部分排序算法都要快。尽管我们可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。
2、快速排序代码实现
1 package cn.com.zfc.lesson21.sort; 2 3 /** 4 * 5 * @title QuickSort 6 * @describe 快速排序 7 * @author 张富昌 8 * @date 2016年10月2日下午2:45:37 9 */ 10 public class QuickSort { 11 // 快速排序是平均时间最快的排序算法。 12 // 基本思想:任选待排序列中的一个数据元素(通常选取第一个数据元素)作为枢轴,用它和所有的剩余元素进行比较,将所有较它小的元素排在它的前面; 13 // 将所有较它大的元素排在它的后面,经过一趟排序后,可按次数据元素所在位置为界,将可序列化分成两个部分; 14 // 再对这两个部分重复上述过程直至每一个部分中只剩下一个数据元素为止。 15 16 public static void main(String[] args) { 17 // 声明整型数组 18 int[] array = new int[10]; 19 // 使用循环和随机数初始化数组 20 for (int i = 0; i < array.length; i++) { 21 array[i] = (int) Math.round(Math.random() * 100); 22 } 23 System.out.println("原始数组为:"); 24 for (int i : array) { 25 System.out.print(i + " "); 26 } 27 System.out.println(); 28 System.out.println("排序后的数组为:"); 29 for (int i : quickSort(array)) { 30 System.out.print(i + " "); 31 } 32 } 33 34 /** 35 * 36 * 功能:对数组进行快速排序,并且返回该数组 37 * 38 * 参数:int[] arr 39 * 40 * 返回类型:int[] 41 */ 42 public static int[] quickSort(int[] arr) { 43 quickSortHelp(arr, 0, arr.length - 1); 44 return arr; 45 } 46 47 /** 48 * 49 * 功能:对数组 arr[low...high] 中的记录进行快速排序 50 * 51 * 参数:int[] arr, int low, int high 52 * 53 * 返回类型:void 54 */ 55 public static void quickSortHelp(int[] arr, int low, int high) { 56 if (low < high) { 57 // 子序列 elem[low...high] 的长度大于 1 58 int pivotLoc = partition(arr, low, high); 59 // 对子序列 arr[low...pivotLoc-1] 递归排序 60 quickSortHelp(arr, low, pivotLoc - 1); 61 // 对子序列 arr[pivotLoc+1...high] 递归排序 62 quickSortHelp(arr, pivotLoc + 1, high); 63 } 64 } 65 66 /** 67 * 68 * 功能:使枢轴元移到正确的位置,要求枢轴左边的元素不大于枢轴,枢轴右边的元素不小于枢轴,并返回枢轴的位置 69 * 70 * 参数:int[] arr, int low,int high 71 * 72 * 返回类型:int 73 */ 74 public static int partition(int[] arr, int low, int high) { 75 while (low < high) { 76 // arr[low] 为枢轴,使 high 右边的元素不小于 elem[low] 77 while (low < high && arr[high] >= arr[low]) { 78 high--; 79 } 80 // 交换 arr[low] 和 arr[high]的值 81 swap(arr, low, high); 82 // arr[high] 为枢轴,使 low 左边的元素不大于 arr[high] 83 while (low < high && arr[low] <= arr[high]) { 84 low++; 85 } 86 // 交换 arr[low]和 arr[high]的值 87 swap(arr, low, high); 88 } 89 // 返回枢轴的位置 90 return low; 91 } 92 93 /** 94 * 95 * 功能:交换两个数的值 96 * 97 * 参数:int x,int y 98 * 99 * 返回类型:void 100 */ 101 public static void swap(int[] arr, int i, int j) { 102 int temp = arr[i]; 103 arr[i] = arr[j]; 104 arr[j] = temp; 105 } 106 }