排序算法之快速排序
来源:互联网 发布: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
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法 之 快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- SIFT定位算法关键步骤的说明
- Oracle 移动数据文件的操作方法
- const 和 #define区别
- 纯CSS隔行换色效果
- ORA-00600 ORA-01565 ORA-27046
- 排序算法之快速排序
- [Leetcode] 7. Reverse Integer
- spring文件上传大小拦截
- 【Fragment使用】(三)使用fragment的几个常见注意事项(重要)
- Apache与Tomcat 区别与联系
- SURF算法与源码分析、上
- ContentProvider详解
- 说说为什么主张反对使用Android Fragment
- 03-11-2015-bbs_v0.1完结