排序算法之快速排序

来源:互联网 发布:mac看视频卡 编辑:程序博客网 时间:2024/06/05 18:11

上次我们对冒泡排序进行了简单的介绍,需要了解的朋友可以不妨去看一下排序算法之冒泡排序。今天要说的快速排序和冒泡排序一样,也是交换排序。

首先了解一下快速排序的思想:

选择一个基准元素,(通常选择第一个元素或者最后一个元素)通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

说起来比较简单,接下来看看如何用代码去实现

public static void quickSort(int[] array, int start, int end){if(start < end){//经过一次排列后,获得基准元素所处的位置int position = getPartition2(array, start, end);quickSort(array, start, position-1);quickSort(array, position+1, end);}}


可以看到,递归排序思路很清晰,但关键的一步在于如何将待排序列分成两部分,并返回基准元素的位置。在如何进行分组的处理上,一般有两种方法:

private static int getPartition(int[] array, int start, int end){//以第一个元素为基准元素int baseNum = array[start];//从前向后遍历的索引int startIndex = start;//从后向前遍历的索引int endIndex = end;while(startIndex < endIndex){//从后向前遍历,找出小于基准元素值的元素位置while(array[endIndex] >= baseNum && startIndex < endIndex)endIndex--;array[startIndex] = array[endIndex];//从前向后遍历,找出大于基准元素值的元素位置while(array[startIndex] <= baseNum && startIndex < endIndex)startIndex++;array[endIndex] = array[startIndex];}array[startIndex] = baseNum;return startIndex;}

这种方法,以第一个元素为基准元素,我们用变量获得第一个元素的值,这就相当于第一个元素位置为空,所以我们从序列的后面向前遍历,获得小于基准元素值的元素,将获得的元素放到第一个元素的位置,这样就相当于获得的元素的位置为空了,然后我们在从前向后遍历,获得大于基准元素的元素,再放到后面为空的位置上……,依次循环下去,直到前后两个索引相等,跳出循环,此时两个索引指向同一个位置,且该位置为空,最后将该位置放置基准元素。自此我们将一个序列,以第一个元素为准,左边的小于该元素,右边的大于该元素。

不过需要注意的一点是,如果序列中有第一个元素有重复元素,那么在从后向前搜索或从前向后搜索时,判断条件应该是>=和<=,否则会陷入死循环。

第二种方法,更加巧妙

private static int getPartition2(int[] array, int start, int end){int baseNum = array[end];int back = start-1;int front = 0;for (front = start; front < end; front++) {if(array[front] < baseNum){back++;swap(array, back, front);}}swap(array, back+1, end);return back+1;}

使用一前一后两个索引,以最后一个元素为基准,从前向后遍历,前索引一直向前走,当前索引指的元素小于基准元素时,后索引前进一步,将前后索引所指的元素进行交换,直至遍历结束。希望能按照步骤自己演示一遍,该算法设计的非常巧妙。最后后索引的后一个元素的值一定是大于基准元素的,所以该元素和最后一个元素进行交换。

最后让我们看一下测试代码

public static void main(String[] args) {int[] array = new int[100]; Random random = new Random();for(int i = 0; i < array.length; i++){array[i] = random.nextInt(200);}for (int i = 0; i < array.length; i++) {System.out.print(array[i] + " ");}System.out.println("\n排序后");quickSort(array, 0, array.length-1);for (int i = 0; i < array.length; i++) {System.out.print(array[i] + " ");}}

至此,快速排序算法结束。推荐一个博客v_JULY_v该博主非常强大,对算法理解很是透彻,有想深入了解算法的朋友,可以多看看

0 0
原创粉丝点击