排序算法之快速排序

来源:互联网 发布:三月软件工作室面试 编辑:程序博客网 时间:2024/05/17 02:20

=====相关链接====

对归并排序感兴趣的同学请点击奥格瑞玛传送门

对堆排序感兴趣的同学请点击达纳苏斯传送门

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

可能光看字面有点难理解,下面我们按照他的定义写一个demo,大家就会掌握快排了

首先给出一个无序数组

int[] array = new int[]{3,2,5,4,3,8,1,9}

我们现在取出一个数,取array[0]为基准点,排序过后分成两组使得左边的数全都小于这个基准点,右边的数全都大于这个基准点

此时我们定义两个游标,左边的为红色,右边的为绿色32543819      第一步我们用右边的游标往左移动,找到比基准值3小的,那么会移动到1的位置,此时将1放入左侧游标所指向的数字,数组变成

12543819      之后我们移动左侧的游标,找到比基准值3打的,会移动到5的位置,然后将5放入右侧游标所指向的数字,数组变成

12543859      现在移动右侧游标找到比3小的,没有找到,右侧游标和左侧游标撞到了一起,到此为止第一次循环就做完了,这个时候两个指针都指向了数组的第三个数字5

12543859       那么这个位置就是我们基准值应该在的位置,这样就可以保证左边都比基准值小,右边都比基准值大,那么得到的最终数组就是

12343859       到此为止第一步分隔成两块数组,已经做完了,那么接下来要做的,就是把基准值左边的数组和右边的数组分别继续做这样的处理,直到每一块被分割的数组只有一个元素为止

这应该不难理解,下面我们直接上代码

public class FastSort {public static void main(String[] args) {int[] array = new int[]{3,2,5,4,3,8,1,9};fastSort(array, 0, array.length-1);print(array);}//快速排序private static void fastSort(int[] array,int l,int r){if(l >=  r){return;}int low = l;int high = r;int key = array[low];while(low < high){//当指针不重合时候,分别进行位移for (;; high--) {if(high <= low){break;}//如果右侧数据小于基准值,则把右侧数据放入左侧游标所指的位置if(array[high] < key){array[low] = array[high];break;}}for (;; low++) {if(high <= low){break;}//如果左侧数据大于基准值,则把左侧数据放入右侧游标所指的位置if(array[low] > key){array[high] = array[low];break;}}}//当两个游标重叠的时候,将基准值放入游标所指向的位置if(low == high){array[low] = key;}//分而治之//对游标左侧递归fastSort(array, l, low - 1);//对游标右侧递归fastSort(array, low + 1, r);}private static void print(int[] array){System.out.println();for (int i : array) {System.out.print( i + ",");}}}



在关键部分我已经写了代码注释,再按照上面的说明,应该不难理解,大家可以把代码拷出来试一下,如有疑问请留言,第一时间解答