`
sunnymoon
  • 浏览: 89311 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据结构与算法(JAVA篇)之高级排序_快速排序(三)

阅读更多
/**
 * @author SunnyMoon
 */

/**********
 * 概念介绍:
 * ********
 *处理小划分:
 * 1. 如果使用三数据项取中值的方法取枢纽,这时快速排序算法不能执行三个或者小于三个数据项
 * 的划分规则,这时数字3就为排序算法的切割点。在上一篇中对三个或三个以下的数据排序时
 * 使用手动的方式排序,这种方式实践中不是最好的选择。
 * 2. 处理小划分的另一个选择是使用插入排序,当使用插入排序时可以将划分设定为10或其它任何
 * 数,试验不同的切割点的值以找到最佳的切割点,专家推荐使用9为切割点。对小的子数组使用
 * 插入排序被证时为最快的一种方法。将插入排序和快速排序相结合,可以把快速排序的性能发挥
 * 到极极,本篇程序使用该方法。
 * 4. 第三个选择是对数组整个使用快速排序不考虑处理小划分,当结束时数据基本有序了,然后
 * 使用插入排序对数据排序。因为插入排序对基本有序的数组执行效率很高,许多专家提倡使用
 * 这种方法,但是插入排序对小规模的数据排序很适合,随着数据规模的扩大性能下降明显。
 *
 * 消除递归:
 * 很多人提倡对快速排序算法进行修改,取消递归包括重写算法用栈实践。但是对于现在的
 * 系统来说消除递归所带来的改进不是很明显。
 */
class ArrayIns {

    private long[] theArray;
    private int nElems;

    public ArrayIns(int max) {
        theArray = new long[max];
        nElems = 0;
    }

    public void insert(long value) {
        theArray[nElems] = value;
        nElems++;
    }

    public void display() {
        System.out.print("A=");
        for (int j = 0; j < nElems; j++) {
            System.out.print(theArray[j] + " ");
        }
        System.out.println("");
    }

    /**
     * 快速排序主方法
     */
    public void quickSort() {
        recQuickSort(0, nElems - 1);
    }

    /**
     * 递归调用快速的排序核心方法
     * @param left
     * @param right
     */
    public void recQuickSort(int left, int right) {
        int size = right - left + 1;
        if (size < 10) {
            insertionSort(left, right);
        } else {
            long median = medianOf3(left, right);//三数取中值
            int partition = partitionIt(left, right, median);//三数据取中值作为枢纽进行划分
            recQuickSort(left, partition - 1);//递归排序数组左子元素
            recQuickSort(partition + 1, right);//递归排序数据左子元素
        }
    }

    /**
     * 三数据选中
     * @param left
     * @param right
     * @return
     */
    public long medianOf3(int left, int right) {
        int center = (left + right) / 2;

        if (theArray[left] > theArray[center]) {
            swap(left, center);
        }
        if (theArray[left] > theArray[right]) {
            swap(left, right);
        }
        if (theArray[center] > theArray[right]) {
            swap(center, right);
        }
        swap(center, right - 1);
        return theArray[right - 1];
    }

    /**
     * 交换数据
     * @param dex1
     * @param dex2
     */
    public void swap(int dex1, int dex2) {
        long temp = theArray[dex1];
        theArray[dex1] = theArray[dex2];
        theArray[dex2] = temp;
    }

    /**
     * 根据三数据选中进行划分
     * @param left
     * @param right
     * @param pivot
     * @return
     */
    public int partitionIt(int left, int right, long pivot) {
        int leftPtr = left;//定位到最左元素
        int rightPtr = right - 1;//定位到枢纽

        while (true) {
            while (theArray[++leftPtr] < pivot);//寻找大于枢纽元素
            while (theArray[--rightPtr] > pivot);//寻找小于枢纽元素
            if (leftPtr >= rightPtr) {//确定划分结束退出循环
                break;
            } else {
                swap(leftPtr, rightPtr);//交换需划分的元素
            }
        }
        swap(leftPtr, right - 1);//恢复枢纽到正确位置
        return leftPtr;//返回枢纽
    }

    /**
     * 手动排序
     * @param left
     * @param right
     */

    public void insertionSort(int left, int right) {
        int in, out;//in为内循环指针,out为外循环指针

        for (out = left + 1; out <= right; out++) {
            long temp = theArray[out];//移除当前标记元素到临时变量
            in = out;//定位内循环

            while (in > left && theArray[in - 1] >= temp) {//满足条件时向左移动元素
                theArray[in] = theArray[in - 1];
                --in;
            }
            theArray[in] = temp;//插入当前标记元素到正确位置
        }
    }
}

/**
 * 主类
 */
public class QuickSort3 {

    public static void main(String[] args) {
        int maxSize = 10;
        ArrayIns arr = new ArrayIns(maxSize);
        for (int j = 0; j < maxSize; j++) {//随机生机数据插入数组中
            long n = (int) (java.lang.Math.random() * 99);
            arr.insert(n);
        }
        System.out.println("显示排序前数据");
        arr.display();
        arr.quickSort();
        System.out.println("显示排序后数据");
        arr.display();
    }
}
/**
 * 运行结果:
 * 显示排序前数据
 * A=56 14 50 18 82 58 30 50 60 1
 * 显示排序后数据
 * A=1 14 18 30 50 50 56 58 60 82
 */

/**
 * 总结:
 * 快速排序是常用排序中效率最高的一种排序方式。
 * 但在应用中的一此特殊情况影响他的效率,这不是算法本身的问题,而是如果实现的问题。
 * 三数据项选中方法很好的解决了这样的问题。三数据选中方法不是最好的选择,可以将插入排序
 * 与快速排序相结合的方式解决这样的问题,使快速排序算法发挥到极致。
 */
 
2
2
分享到:
评论

相关推荐

    数据结构与算法分析_java语言描述_Mark_Allen_Weiss著_课后习题答案

    根据提供的文件信息,以下是关于《数据结构与算法分析_java语言描述_Mark_Allen_Weiss著_课后习题答案》中所涉及的知识点。 首先,本书的标题明确指出了它主要关注两个方面:数据结构和算法分析,同时使用Java语言...

    java数据结构与算法.pdf

    在编程领域,数据结构与算法是核心组成部分,它们直接影响到程序的效率和性能。Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点...

    数据结构与算法代码详解JAVA版

    在Java中,我们可以使用各种算法来解决实际问题,例如排序算法(冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等)、查找算法(顺序查找、二分查找、哈希查找)以及图论中的最短路径算法(Dijkstra算法...

    数据结构与算法(JAVA语言版)

    数据结构与算法是计算机科学的基础,对于理解和解决复杂问题至关重要。...通过阅读《数据结构与算法(JAVA语言版)》这本书,你将深入理解这些概念,并能熟练运用Java语言实现它们,从而提升你的编程能力。

    数据结构与算法 Java版

    数据结构与算法是计算机科学的基础,对于任何编程语言来说,理解和掌握它们都是至关重要的,特别是对于Java这样的高级语言。在Java中实现数据结构和算法,能够帮助开发者更高效地解决问题,提升程序性能。 数据结构...

    数据结构与算法(Java语言版)含有源码

    本资源包含两部分:一本名为“数据结构与算法(JAVA语言版)”的PDF教程和一个“源码.zip”压缩包,提供了相关的Java实现。 1. 数据结构:数据结构是组织和存储数据的方式,它直接影响到算法的效率。常见的数据结构...

    java数据结构与算法中文版

    《Java数据结构与算法中文版》是一本深入探讨编程核心领域的书籍,主要针对Java程序员,旨在提升他们在数据处理和问题解决能力上的技能。这本书详细介绍了数据结构和算法的基础理论及其在Java语言中的实现,是Java...

    数据结构与算法分析(java语言描述)中文第二版以及习题答案

    数据结构与算法分析是计算机科学中的核心领域,对于任何Java开发者来说,理解并掌握这部分内容至关重要。本资源包含了《数据结构与算法分析》一书的Java语言描述中文第二版,以及配套的习题答案,无论是英文还是中文...

    Java数据结构和算法.pdf

    资源摘要信息是关于Java数据结构和算法的知识点总结,涵盖了数组、栈与队列、链表、递归、哈希表、高级排序、二叉树、红黑树、堆、带权图等数据结构和算法概念。 一、数组 * 数组是相同类型变量的集合,可以使用...

    数据结构与算法分析(java版内含源代码)

    《数据结构与算法分析》是计算机科学领域的一本经典著作,尤其在Java版本中,它深入探讨了如何在Java编程语言中实现各种数据结构和算法。这本书不仅提供了理论知识,还通过提供源代码实例,帮助读者更好地理解和应用...

    Java数据结构和算法中文第二版_Java数据结构_

    《Java数据结构和算法中文第二版》是一本深入探讨Java编程中数据结构和算法的书籍。数据结构是计算机科学的基础,它涉及到如何有效地组织和存储数据,以便在各种操作下高效地访问和修改。算法则是解决问题的具体步骤...

    数据结构与算法-java

    以下是基于标题“数据结构与算法-java”及描述中提到的“数据结构与算法分析_Java语言描述高清版(第2版)1.pdf”所涵盖的一些关键知识点: 1. **数据结构**: - **数组**:最基础的数据结构,存储固定大小的同类型...

    数据结构与算法JAVA版

    本资料包“数据结构与算法JAVA版”聚焦于这个核心主题,包含了用Java实现的各种数据结构和算法。 1. **数据结构**: - **数组**:是最基本的数据结构,提供了固定大小的存储空间,通过索引访问元素。Java中的数组...

    数据结构与算法(java版)

    数据结构与算法是计算机科学的基础,对于理解和解决复杂问题至关重要。在Java环境下,这些概念的实现使得程序设计更加高效和优化。以下将详细介绍标题和描述中提到的关键知识点: 1. **栈与队列**: - 栈(Stack)...

    数据结构与算法分析_Java语言描述(第2版) 源代码

    《数据结构与算法分析_Java语言描述(第2版) 源代码》是一本深入探讨数据结构和算法的书籍,其源代码是学习和理解书中理论的重要实践资源。这本书籍主要面向计算机科学专业的学生以及对算法有深入研究需求的开发者。...

    Java 数据结构与算法+源代码 高清版

    这份“Java数据结构与算法+源代码高清版”资源旨在帮助开发者深入理解并掌握这些关键概念。 首先,让我们来探讨数据结构。数据结构是组织和存储数据的方式,它为算法提供了基础。常见的数据结构包括数组、链表、栈...

    数据结构与算法分析 java语言描述第三版 源代码

    《数据结构与算法分析——Java语言描述》第三版是一本深入探讨数据结构和算法的经典教材。这本书通过使用Java编程语言,向读者展示了如何设计、实现和分析一系列关键的数据结构和算法,以解决实际问题。书中的源代码...

    数据结构与算法 java版

    数据结构与算法是计算机科学的基础,对于任何编程语言来说,理解和掌握它们都是至关重要的,特别是对于Java这样的高级语言。在Java中实现数据结构和算法,能够帮助开发者编写更高效、可维护的代码。 《Java数据结构...

    数据结构与算法分析_Java语言描述(第3版)完整源码

    《数据结构与算法分析_Java语言描述(第3版)》是一本权威的教材,涵盖了这一领域的基础到高级知识,通过完整的源码,读者可以深入理解并实践这些概念。 首先,我们来看看提供的压缩包中包含的一些关键文件: 1. **...

Global site tag (gtag.js) - Google Analytics