`
sunwinner
  • 浏览: 203469 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

快速排序实现2

 
阅读更多

这个算法实现中,对小的子数组使用插入排序,借此来提高性能。

Knuth推荐对小数组的切割点为9,正是程序中使用的值。实践中还需要根据测试请看选择更好的切割点。

 

import java.util.Random;

public class QuickSort2 {

    private long[] theArr;
    private int nElems;

    public QuickSort2(int max) {
        this.theArr = new long[max];
        this.nElems = 0;
    }

    public void insert(long value) {
        this.theArr[nElems++] = value;
    }

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

        System.out.println();
    }

    public void quickSort() {
        this.recQuickSort(0, nElems - 1);
    }

    public void recQuickSort(int left, int right) {
        int size = right - left + 1;

        if (size <= 9) {
            // insert sort or sth. else.
            insertSort(left, right);
        } else {
            // quick sort
            long median = medianOf3(left, right);
            int partition = partitionIt(left, right, median);
            recQuickSort(left, partition - 1);
            recQuickSort(partition + 1, right);
        }
    }

    public void insertSort(int left, int right) {
        int in, out;
        for (out = left + 1; out <= right; out++) {
            long temp = theArr[out];
            in = out;

            while (in > left && theArr[in - 1] > temp) {
                theArr[in] = theArr[in - 1];
                --in;
            }
            theArr[in] = temp;
        }
    }

    /**
     * 因为使用了取头尾和中间点的中值作为枢纽点,并且在median3方法中
     * 已经对三个值进行了正确的排序,左右指针都不会越界,所以这里去除了对leftPtr &lt; right
     * 和rightPtr &gt; left的检测,稍微提高了性能。
     *
     */
    public int partitionIt(int left, int right, long pivot) {
        int leftPtr = left;
        int rightPtr = right - 1;
        while (true) {
            while (theArr[++leftPtr] < pivot) {
                //
            }

            while (theArr[--rightPtr] > pivot) {
                //
            }

            if (leftPtr >= rightPtr) {
                break;
            } else {
                swap(leftPtr, rightPtr);
            }
        }
        swap(leftPtr, right - 1);
        return leftPtr;
    }

    /**
     * 取三中值法,分别取头尾和中间的点,
     * 分别取得正确位置以后,再将中值放到最后一个位置进行快速排序。
     */
    public long medianOf3(int left, int right) {
        int center = (left + right) / 2;

        if (theArr[left] > theArr[center]) {
            swap(left, center);
        }

        if (theArr[left] > theArr[right]) {
            swap(left, right);
        }

        if (theArr[center] > theArr[right]) {
            swap(center, right);
        }

        swap(center, right - 1);
        return theArr[right - 1];
    }

    public void swap(int dex1, int dex2) {
        long temp = theArr[dex1];
        theArr[dex1] = theArr[dex2];
        theArr[dex2] = temp;
    }


    public static void main(String... args) {
        if (args.length < 1) {
            System.out.println("usage: java QuickSort2 number");
            return;
        }

        QuickSort2 qs = new QuickSort2(100);
        int count = Integer.parseInt(args[0]);
        Random rand = new Random();
        for (int i = 0; i < count; i++) {
            qs.insert(rand.nextInt(count * count));
        }
        qs.display();
        qs.quickSort();
        qs.display();
    }
}

 选取三中值是为了防止在极端情况下,比如每次选取的中值是所有数据中最大或者最小的情况,快速排序性能急剧下降。

 

分享到:
评论

相关推荐

    C语言实现多种链表快速排序

    在C语言中实现链表快速排序,首先需要理解链表和快速排序的基本概念。链表不同于数组,它不连续存储数据,而是通过指针连接各个节点。每个节点包含数据元素和指向下一个节点的指针。快速排序的核心是“分区操作”和...

    快速排序 --- 非递归实现

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R....总的来说,这个压缩包提供了一个非递归实现快速排序的完整示例,通过自定义栈的数据结构,实现了快速排序算法,适用于理解和学习快速排序的非递归实现方式。

    快速排序算法(c#实现)

    快速排序的平均时间复杂度为O(n log n),在最坏的情况下(输入数组已经完全有序或逆序),时间复杂度为O(n^2)。然而这种情况在实际应用中很少出现,因为快速排序通常能在实际数据集上表现出优秀的性能。同时,由于...

    快速排序算法的简单实现

    快速排序是实际运用中用的最多的算法,虽然它在最坏的情况下会达到n^2,但它的平均性能非常好,期望时间复杂度为nlgn,而且隐含的常数因子非常小,并且是原址排序。 快速排序原理:从一组数中任意选出一个数,将...

    用java实现快速排序

    根据给定文件的信息,本文将围绕“用Java实现快速排序”的主题进行展开,不仅解析标题与描述中的核心知识点,还会对部分代码示例进行解读,最后结合这些信息给出一个完整的快速排序算法实现。 ### 快速排序算法简介...

    快速排序的递归简洁实现

    ### 快速排序的递归简洁实现 #### 分区函数(Partition) 分区是快速排序的核心步骤,其主要目标是选择一个基准元素(pivot),并将所有小于等于该基准的元素移动到基准的左边,所有大于该基准的元素移动到基准的...

    快速排序算法c++实现

    C++是面向对象的编程语言,它提供了丰富的库支持和高效的语言特性,非常适合实现各种算法,包括快速排序。在C++中实现快速排序,通常需要以下步骤: 1. **选择基准元素**:可以随机选取数组中的一个元素作为基准,...

    JAVA实现快速排序

    最坏情况下快速排序的时间复杂度为O(n^2)。 * 最好时间复杂度:最好情况是指每次区间划分的结果都是基准关键字的左右两边长度相等或者相差为1,即选择的基准关键字为待排序的记录的中间值。此时进行比较次数总共为...

    C语言快速排序算法实现

    标题:C语言快速排序算法实现 描述:本文将深入探讨如何使用C语言实现快速排序算法,这是一种高效的排序方法,广泛应用于各种数据结构处理场景。快速排序的基本思想是通过一趟排序将待排记录分隔成独立的两部分,...

    快速排序 数据结构 实现

    快速排序的时间复杂度在最坏情况下为O(n²),但平均情况下为O(n log n),且其内部循环可以在大部分硬件上很高效地实现,因此快速排序通常是实际应用中最常用的排序算法之一。空间复杂度为O(log n),这是由于递归调用...

    各种排序的C++算法实现(插入排序、合并排序、堆排序、快速排序)

    全面的排序算法实现,包括插入排序、合并排序、堆排序、快速排序。 堆排序:HeapSort 讲解详见http://blog.csdn.net/fly_yr/article/details/8550701 插入排序:InSertion_Sort 讲解详见...

    排序算法编程 堆排序 快速排序

    本主题将深入探讨四种常见的排序算法:堆排序、快速排序以及两种未在标题中明确提到但同样重要的排序方法——基数排序和计数排序。 首先,让我们详细了解一下堆排序。堆排序是一种基于比较的排序算法,利用了数据...

    快速排序 java实现

    快速排序 java实现

    c++模板类实现快速排序

    以下是一个简单的C++模板类实现快速排序的示例: ```cpp template void quickSort(T arr[], int left, int right) { if (left ) { int pivotIndex = partition(arr, left, right); quickSort(arr, left, pivot...

    java 快速排序 折半查找的界面实现 (递归与分治法)

    在Java中,快速排序可以这样实现: ```java public class QuickSort { public static void quickSort(int[] arr, int low, int high) { if (low ) { int pivotIndex = partition(arr, low, high); quickSort...

    用C语言实现快速排序

    这是一个用C语言实现的快速排序的程序,它实现了对一个英文文本中的单词排序并将排序结果输出到另外一个文件中。

    快速排序算法实现

    快速排序算法C语言实现,快排序算法QuickSort.cpp

    MPI实现的快速排序

    用MPI实现的快速排序,提高快速排序的效率

    sort_快速排序的mips实现_

    6. **边界处理**:在实际的MIPS快速排序实现中,还需要考虑数组为空或只包含一个元素的情况,这些情况不需要排序,可以直接返回。 7. **优化**:为了提高效率,可以考虑使用尾递归优化,或者在划分过程中减少不必要...

    确定性快速排序与随机化快速排序的比较

    快速排序期望的时间复杂度为O(nlogn),但在最坏的情况下,它的时间复杂度可上升至O(n^2),例如当每次选择的分界线位于序列的边界时。为了避免这种情况,提出了随机化快速排序的概念。 随机化快速排序在选择基准元素...

Global site tag (gtag.js) - Google Analytics