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

839478591fu

839478591fu

2016-02-19 09:07

只要你有一台电脑或者手机,都能关注图老师为大家精心推荐的快速排序的深入详解以及java实现,手机电脑控们准备好了吗?一起看过来吧!
快速排序作为一种高效的排序算法被广泛应用,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]);
        }
    }
}
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
快速排序的深入详解以及java实现

深入Java冒泡排序与选择排序的区别详解

编程语言 网络编程
深入Java冒泡排序与选择排序的区别详解

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

深入XPath的详解以及Java示例代码分析

编程语言 网络编程
深入XPath的详解以及Java示例代码分析

深入Ajax代理的Java Servlet的实现详解

编程语言 网络编程
深入Ajax代理的Java Servlet的实现详解

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Java实现数据排序算法

编程语言 网络编程
Java实现数据排序算法

深入Java Robot实现控制鼠标和键盘的方法详解

编程语言 网络编程
深入Java Robot实现控制鼠标和键盘的方法详解

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

word自选图形的阴影

word自选图形的阴影

c# 托盘双击不触发单击事件的实现方法

c# 托盘双击不触发单击事件的实现方法
下拉加载更多内容 ↓