在编写快速排序的代码时,我们需要先了解一下快速排序的原理。
什么叫快速排序?
通过一次排序把需要排序的数据分割成两个独立的部分,其中一部的所有数据都比另外一部要小,通过此种排序方法再对之前分割后的两部分数据分别进行快速排序,整个排序的过程中使用递归方式进行,最终将所有需要排序的数据变成有序序列。
理解好上面的原理后再来看java代码的实现将很好理解这其中的奥妙:
/** * 将数组的某一段元素进行划分,小的在左边,大的在右边 */ public static int divide(int[] a, int start, int end){ //每次都以最右边的元素作为基准值 int base = a[end]; //start一旦等于end,就说明左右两个指针合并到了同一位置,可以结束此轮循环。 while(start < end){ while(start < end && a[start] <= base) //从左边开始遍历,如果比基准值小,就继续向右走 start++; //上面的while循环结束时,就说明当前的a[start]的值比基准值大,应与基准值进行交换 if(start < end){ //交换 int temp = a[start]; a[start] = a[end]; a[end] = temp; //交换后,此时的那个被调换的值也同时调到了正确的位置(基准值右边),因此右边也要同时向前移动一位 end--; } while(start < end && a[end] >= base) //从右边开始遍历,如果比基准值大,就继续向左走 end--; //上面的while循环结束时,就说明当前的a[end]的值比基准值小,应与基准值进行交换 if(start < end){ //交换 int temp = a[start]; a[start] = a[end]; a[end] = temp; //交换后,此时的那个被调换的值也同时调到了正确的位置(基准值左边),因此左边也要同时向后移动一位 start++; } } //这里返回start或者end皆可,此时的start和end都为基准值所在的位置 return end; }
/** * 排序 */ public static void sort(int[] a, int start, int end){ if(start > end){ //如果只有一个元素,就不用再排下去了 return; } else{ //如果不止一个元素,继续划分两边递归排序下去 int partition = divide(a, start, end); sort(a, start, partition-1); sort(a, partition+1, end); } }
使用姿势:
int[] array = {1,3,4,5,11,14,2,6,19,99}; sort(array,0,array.length -1); for(int a :array){ System.out.println(a+" "); }
最终打印的结果: