快速排序是效率较高的排序方法,采用了分治法。将一个大的数组分解成多个小数组,保证每个小数组是顺序的,则整个大数组也就是顺序的了。java
我学习的过程是这样的:数组
1 先看了下维基百科上面的解释。函数
2 本身分析整个过程。学习
3 写代码实现。ui
维基百科的解释以下:spa
有了如上的解释,咱们本身分析下这个过程。code
首先是有一个数组。而后咱们随便选取一个数字做为基准,将全部小于该数字的元素,移动到左侧。全部大于该数字的元素,移动到该数字的右侧。咱们这里有个方法,就是基准元素,老是选择这个数组序列的第一个元素。这样的话,咱们只用将小于该数字的元素移动到左侧来便可。而后以这个基准元素的下标为基准点,将该数组分红两段,而后针对这两个数组,肯定其基准,再次排序。一直到全部的元素都肯定顺序后,整个排序过程结束。排序
看看整段代码的结构。递归
package com.bplead.sort; public class QuickSort { public static void qsort(int a[],int begin,int end){ if(begin > end){ return; } prt(a); int pivotindex = partition(a,begin,end); qsort(a,begin,pivotindex-1); qsort(a,pivotindex+1,end); } public static int partition(int a[],int left,int right){ int keyindex = left; int temp = 0; for(int i=left+1;i<=right;i++){ if(a[i] < a[keyindex]){ temp = a[i]; for(int j=i;j>keyindex;j--){ a[j] = a[j-1]; } a[keyindex] = temp; keyindex ++; } } return keyindex; } public static void main(String[] args) { int array[] = {43,24,12,56,78,9,67,50,1,2,1,9,87}; qsort(array,0,array.length-1); } private static void prt(int[] array){ for(int i=0;i<array.length;i++) System.out.print(array[i] + " "); System.out.println(); } }
咱们看一下partition分区函数把。ip
咱们将基准元素选择为第一个元素,循环遍历整个数组,使其元素和基准元素进行比较,若是遍历的当前元素比基准元素小,则当前元素之前的全部元素(不包含当前元素)都向右移动一位,当前元素放置到基准元素之前。一个分区函数执行完成后,全部小于该基准元素的元素都会移动到基准元素左侧了。
我这里把整个快速排序的过程都打印出来了,过程以下:
43 24 12 56 78 9 67 50 1 2 1 9 87
24 12 9 1 2 1 9 43 56 78 67 50 87
12 9 1 2 1 9 24 43 56 78 67 50 87
9 1 2 1 9 12 24 43 56 78 67 50 87
1 2 1 9 9 12 24 43 56 78 67 50 87
1 2 1 9 9 12 24 43 56 78 67 50 87
1 1 2 9 9 12 24 43 56 78 67 50 87
1 1 2 9 9 12 24 43 56 78 67 50 87
1 1 2 9 9 12 24 43 56 78 67 50 87
1 1 2 9 9 12 24 43 50 56 78 67 87
1 1 2 9 9 12 24 43 50 56 78 67 87
1 1 2 9 9 12 24 43 50 56 67 78 87
1 1 2 9 9 12 24 43 50 56 67 78 87
原数组是:
43 24 12 56 78 9 67 50 1 2 1 9 87
第一次分区操做:咱们选择43为基准,则全部小于43的元素均在43左侧。获得以下序列。
24 12 9 1 2 1 9 43 56 78 67 50 87
第二次分区操做,将43之前的元素看成一个序列,之后的元素也看成一个序列。咱们须要注意的是,已经肯定过的这个基准元素,做为分割数组的标记,该元素不用划分到左右两个数组中。