`
祖祖cool
  • 浏览: 52384 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

分享:快速排序实例

阅读更多
快速排序实例

代码如下:
import org.rut.util.algorithm.SortUtil;
public class QuickSort implements SortUtil.Sort{
    public void sort(int[] data) {
        quickSort(data,0,data.length-1);       
    }
    private void quickSort(int[] data,int i,int j){
        int pivotIndex=(i+j)/2;
        //swap
        SortUtil.swap(data,pivotIndex,j);
        int k=partition(data,i-1,j,data[j]);
        SortUtil.swap(data,k,j);
        if((k-i)>1) quickSort(data,i,k-1);
        if((j-k)>1) quickSort(data,k+1,j);
       
    }
   private int partition(int[] data, int l, int r,int pivot) {
        do{
           while(data[++l]<pivot);
           while((r!=0)&&data[--r]>pivot);
           SortUtil.swap(data,l,r);
        }
        while(l<r);
        SortUtil.swap(data,l,r);       
        return l;
    }
}


改进后的快速排序:



import org.rut.util.algorithm.SortUtil;
public class ImprovedQuickSort implements SortUtil.Sort {
    private static int MAX_STACK_SIZE=4096;
    private static int THRESHOLD=10;
    public void sort(int[] data) {
        int[] stack=new int[MAX_STACK_SIZE];
        int top=-1;
        int pivot;
        int pivotIndex,l,r;
        stack[++top]=0;
        stack[++top]=data.length-1;
        while(top>0){
            int j=stack[top--];
            int i=stack[top--];
            pivotIndex=(i+j)/2;
            pivot=data[pivotIndex];
            SortUtil.swap(data,pivotIndex,j);
            l=i-1;
            r=j;
            do{
                while(data[++l]<pivot);
                while((r!=0)&&(data[--r]>pivot));
                SortUtil.swap(data,l,r);
            }
            while(l<r);
            SortUtil.swap(data,l,r);
            SortUtil.swap(data,l,j);
            if((l-i)>THRESHOLD){
                stack[++top]=i;
                stack[++top]=l-1;
            }
            if((j-l)>THRESHOLD){
                stack[++top]=l+1;
                stack[++top]=j;
            }
           
        }
        insertSort(data);
    }
    private void insertSort(int[] data) {
        int temp;
        for(int i=1;i<data.length;i++){
            for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){
                SortUtil.swap(data,j,j-1);
            }
        }      
    }
}


3
3
分享到:
评论
2 楼 祖祖cool 2011-12-06  
的确,可以把效率提高很多
1 楼 ankyhe 2011-12-05  
一般建议,在quick sort之前随即排序一下,这样可以避免最差的时间复杂度。
另外,Python和Java 7的sort都改成timsort了,你可以看看,实现有些困难,不过效率更好。

相关推荐

    PHP快速排序算法实例分析

    本文实例讲述了PHP快速排序算法。分享给大家供大家参考,具体如下: 快速排序:在无序的数组$data中,选择任意一个值作为对比值,定义i为头部检索索引,j为尾部检索索引, 算法步骤: (1)初始化对比值$value=$data...

    c语言10个数据结构设计实例二叉树建立遍历冒泡排序快速排序等

    c语言10个数据结构设计实例二叉树建立遍历冒泡排序快速排序等提取方式是百度网盘分享地址

    Python快速排序算法实例分析

    本文实例讲述了Python快速排序算法。分享给大家供大家参考,具体如下: 快速排序的时间复杂度是O(NlogN) 算法描述: ① 先从序列中取出一个数作为基准数 ② 分区过程, 将比这个数大的数全部放到它的右边, 小于或等于...

    Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例

    本文实例讲述了Python实现的插入排序,冒泡排序,快速排序,选择排序算法。分享给大家供大家参考,具体如下: #!/usr/bin/python # coding:utf-8 #直接插入排序 def insert_sort(list): for i in range(len(list))...

    PHP排序算法之快速排序(Quick Sort)及其优化算法详解

    本文实例讲述了PHP排序算法之快速排序(Quick Sort)及其优化算法。分享给大家供大家参考,具体如下: 基本思想: 快速排序(Quicksort)是对冒泡排序的一种改进。他的基本思想是:通过一趟排序将待排记录分割成独立的...

    纯C语言:分治快速排序源码分享

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的核心思想是分治策略,即将一个大问题分解为若干个小问题来解决。在快速排序中,我们选择一个基准值(pivot),然后将数组分为两...

    PHP快速排序quicksort实例详解

    本文实例讲述了PHP快速排序quicksort。分享给大家供大家参考,具体如下: quicksort 在快速排序算法中,使用了分治策略。首先把序列分成两个子序列,递归地对子序列进行排序,直到整个序列排序结束。(即一分为二的...

    php冒泡排序、快速排序、快速查找、二维数组去重实例分享

    2. **快速排序**:快速排序是一种高效的排序算法,基于分治策略。`quick_sort` 函数首先选择一个基准元素,然后将数组分为小于基准和大于基准的两部分,分别对这两部分递归地进行快速排序。最后,将排序好的两部分...

    javascript与Python快速排序实例对比

    本文实例对比了javascript与Python快速排序实现方法。分享给大家供大家参考。具体如下: js实现方法: function quicksort(arr) { if (arr.length &lt;= 1) return arr return quicksort(arr.filter(function ...

    Python实现快速排序的方法详解

    本文实例讲述了Python实现快速排序的方法。分享给大家供大家参考,具体如下: 说起快排的Python实现,首先谈一下,快速排序的思路: 1、取一个参考值放到列表中间,初次排序后,让左侧的值都比他小,右侧的值,都比...

    Go语言实现冒泡排序、选择排序、快速排序及插入排序的方法

    本文实例讲述了Go语言实现冒泡排序、选择排序、快速排序及插入排序的方法。分享给大家供大家参考。具体分析如下: 算法是程序的灵魂,而排序算法则是一种最基本的算法。排序算法有许多种,这里介绍4中排序算法:冒泡...

    源码实例python实例源码算法经典100

    这些实例可能是数据结构的实现(如链表、树、堆、图等)、排序算法(如快速排序、归并排序)、搜索算法(如二分搜索)、动态规划、贪心算法、图算法等。 在学习算法时,理解和实现这些经典实例是提高算法能力的基础...

    C#快速排序算法实例分析

    本文实例讲述了C#快速排序算法。分享给大家供大家参考。具体实现方法如下: public static int[] QuickSort(int[] arr) { if (arr.Length &lt;= 1) return arr; int pivot = arr.Length - 1; int[] less = ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    其他的请看ID:ljtt123(本人分享) 本博客提供的所有教程的资源原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该文献之人无任何...

    protues 实例 Data Sorting

    **Protues实例:数据排序** Protues是一款强大的虚拟原型设计工具,特别适合电子工程师和学生在电路设计和仿真中使用。这个"Data Sorting"实例展示了如何利用Protues平台进行数字逻辑设计,特别是涉及到数据处理和...

    分页存储过程实例分享.doc

    分页存储过程实例分享 分页存储过程是数据库中一个常用的技术,能够帮助我们快速获取指定的数据记录,并且可以根据需要进行排序和过滤。下面是对该存储过程的详细解释: 存储过程参数 该存储过程共有7个参数: 1...

    C#使用委托实现的快速排序算法实例

    本文实例讲述了C#使用委托实现的快速排序算法。分享给大家供大家参考。具体如下: class QuickSort { private delegate int CmpOp(object Left, object Right); private void swap(object[] Array, int Left, int...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    其他的请看ID:ljtt123(本人分享) 本博客提供的所有教程的资源原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该文献之人无任何...

    PowerBuilder经典实例

    - **应用框架**:PowerBuilder提供预定义的应用框架,帮助开发者快速构建应用程序的结构和流程。 - **PBL(PowerBuilder Library)库**:存储对象、窗口、菜单等组件的地方,方便复用和版本控制。 2. 学生成绩...

    华表插件学习实例-第一部分

    本学习实例是针对华表插件的初学者设计的,旨在帮助用户快速掌握华表的基本操作和功能。通过实例化的教学方式,让学习过程变得简单易懂。"CellOrder (Asp.net+C#+XML)" 这个文件名暗示了我们将涉及到Asp.NET、C#编程...

Global site tag (gtag.js) - Google Analytics