快速排序的深入详解以及java实现

2016-02-19 09:07 31 1 收藏

只要你有一台电脑或者手机,都能关注图老师为大家精心推荐的快速排序的深入详解以及java实现,手机电脑控们准备好了吗?一起看过来吧!

【 tulaoshi.com - 编程语言 】

快速排序作为一种高效的排序算法被广泛应用,SUN的JDK中的Arrays.sort 方法用的就是快排。
快排采用了经典的分治思想(divide and conquer):

Divide:选取一个基元X(一般选取数组第一个元素),通过某种分区操作(partitioning)将数组划分为两个部分:左半部分小于等于X,右半部分大于等于X。
Conquer: 左右两个子数组递归地调用Divide过程。
Combine:快排作为就地排序算法(in place sort),不需要任何合并操作
可以看出快排的核心部分就是划分过程(partitioning),下面以一个实例来详细解释如何划分数组(图取自于《算法导论》)
初始化:选取基元P=2,就是数组首元素。i=1,j=i+1=2 (数组下标以1开头)
循环不变量:2~i之间的元素都小于或等于P,i+1~j之间的元素都大于或等于P

循环过程:j从2到n,考察j位置的元素,如果大于等于P,就继续循环。如果小于P,就将j位置的元素(不应该出现在i+1~j这个区间)和i+1位置(交换之后仍在i+1~j区间)的元素交换位置,同时将i+1.这样就维持了循环不变量(见上述循环不变量说明)。直到j=n,完成最后一次循环操作。
要注意的是在完成循环后,还需要将i位置的元素和数组首元素交换以满足我们最先设定的要求(对应图中的第i步)。

细心的读者可能会想到另一种更直白的分区方法,即将基元取出存在另一相同大小数组中,遇到比基元小的元素就存储在数组左半部分,遇到比基元大的元素就存储在数组右半部分。这样的操作复杂度也是线性的,即Theta(n)。但是空间复杂度提高了一倍。这也是快排就地排序的优势所在。

代码如下:

public class QuickSort {
    private static void QuickSort(int[] array,int start,int end)
    {
        if(startend)
        {
            int key=array[start];//初始化保存基元
            int i=start,j;//初始化i,j
            for(j=start+1;j=end;j++)

                if(array[j]key)//如果此处元素小于基元,则把此元素和i+1处元素交换,并将i加1,如大于或等于基元则继续循环
                {
                    int temp=array[j];
                    array[j]=array[i+1];
                    array[i+1]=temp;
                    i++;
                }

            }
            array[start]=array[i];//交换i处元素和基元
            array[i]=key;
            QuickSort(array, start, i-1);//递归调用
            QuickSort(array, i+1, end);

        }

    }
    public static void main(String[] args)
    {
        int[] array=new int[]{11,213,134,44,77,78,23,43};
        QuickSort(array, 0, array.length-1);
        for(int i=0;iarray.length;i++)
        {
            System.out.println((i+1)+"th:"+array[i]);
        }
    }
}

来源:http://www.tulaoshi.com/n/20160219/1589604.html

延伸阅读
在Java 5.0之前启动一个任务是通过调用Thread类的start()方法来实现的,任务的提于交和执行是同时进行的,如果你想对任务的执行进行调度或是控制 同时执行的线程数量就需要额外编写代码来完成。5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接 池的线程池来执行任务。这个架构主要有三个接...
Java中使用的路径,分为两种:绝对路径和相对路径。 归根结底,Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法,都不过是一些便利方法。不过是API在底层帮助我们构建了绝对路径,从而找到资源的! 在开发Web方面的应用时, 经常需要获取 服务器中当前WebRoot的物理路径。 如果是Servlet , Action , Controller, 或则Filte...
很多主流框架都使用了反射技术.像ssh框架都采用两种技术 xml做配置文件+反射技术. 与反射有关的类包. java.lang.reflect.*;和java.lang.Class; Java中所有类型(包括基本类型)都对应一个Class对象,这个Class就是java.lang.Class。即每一个类型,在Class中都有一个Class对象跟它对应.Class 没有公共构造方法。注意不是没有,是没有公共的. ...
标签: Web开发
Lucene中的自定义排序功能和Java集合中的自定义排序的实现方法差不多,都要实现一下比较接口. 在Java中只要实现Comparable接口就可以了.但是在Lucene中要实现SortComparatorSource接口和ScoreDocComparator接口.在了解具体实现方法之前先来看看这两个接口的定义吧. SortComparatorSource接口的功能是返回一个用来排序ScoreDocs的comparator(Expe...
原理是使用LinkedHashMap来实现,当缓存超过大小时,将会删除最老的一个元组。 实现代码如下所示 代码如下: import java.util.LinkedHashMap; import java.util.Map; public class LRUCache {  public static class CachedData {   private Object data = null;   private long time = 0;   private boole...

经验教程

667

收藏

79
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部