美文网首页
快速排序法

快速排序法

作者: Stroman | 来源:发表于2018-02-04 10:09 被阅读7次
package com.company;

public class QuickSort {
    /**
     * 这是快速排序的非递归算法
     * 是用栈来实现的
     * 用栈来存储分组下标解决此问题
     * @param sourceArray
     */
    static public void quickSort0(int[] sourceArray) {
        int arrayLength = sourceArray.length;
        //创建一个栈用来存储下标
        //其实不用着整个数组那么长的
        int[] indexStack = new int[arrayLength];
        //栈顶指针
        int indexStackTop = -1;
        //因为整个数组是一个分组
        //所以先把整个数组的首尾下标存入栈中
        indexStack[++indexStackTop] = 0;
        indexStack[++indexStackTop] = arrayLength - 1;
        //只要栈顶没有到栈底
        //或者说
        //栈中有元素存在就说明排序没完成
        //用于记录趟数
        int counter = 0;
        while (indexStackTop > -1) {
            int endIndex = indexStack[indexStackTop--];
            int headIndex = indexStack[indexStackTop--];
            if (endIndex > headIndex) {
                //每个分组里面最起码也得有2个元素
                //1个元素那必然是有序的
                //参照元素
                //还是取每个分组最左边那个
                int referenceElement = sourceArray[headIndex];
                int headPointer = headIndex;
                int endPointer = endIndex;
                while (headPointer < endPointer) {
                    //从后往前找比参考元素小的元素
                    while (sourceArray[endPointer] > referenceElement && headPointer < endPointer)
                        endPointer--;
                    //从前往后找比参考元素大的元素
                    //这个地方一定要带等号,否则会
                    // 发生参照元素不正确替换的问题。
                    while (sourceArray[headPointer] <= referenceElement && headPointer < endPointer)
                        headPointer++;
                    //找到了
                    //这个时候也得判断一下
                    if (headPointer < endPointer) {
                        int tempElement = sourceArray[endPointer];
                        sourceArray[endPointer] = sourceArray[headPointer];
                        sourceArray[headPointer] = tempElement;
                    }
                }
                //这个时候参考元素的最终位置就已经找到了
                //即headPointer == endPointer,但是
                // 这个地方的值不一定比参照值小,比如说
                // 参照值比它后面所有的值都小的话。所以
                // 这里还要判断一下
                sourceArray[headIndex] = sourceArray[headPointer];
                sourceArray[headPointer] = referenceElement;
                for (int element:sourceArray) {
                    System.out.print(element + " ");
                }
                System.out.println("--第" + ++counter + "趟完成");
                //然后向栈里面塞入新分组的首尾下标
                //前一个分组
                if (headIndex < headPointer - 1) {
                    indexStack[++indexStackTop] = headIndex;
                    indexStack[++indexStackTop] = headPointer - 1;
                }
                //后一个分组
                if (headPointer + 1 < endIndex) {
                    indexStack[++indexStackTop] = headPointer + 1;
                    indexStack[++indexStackTop] = endIndex;
                }
            }
        }
    }

    /**
     * 下面实现的是快速排序的递归算法
     * 短小精悍,但是它能够清晰地体现
     * 出快速排序法的思想。
     * @param sourceArray
     */
    static public void quickSort1(int[] sourceArray) {
        int arrayLength = sourceArray.length;
        QuickSort.divideGroup(sourceArray,0,arrayLength - 1);
    }

    /**
     * 这就是递归体了
     * @param sourceArray
     * @param headIndex
     * @param endIndex
     */
    static private void divideGroup(int[] sourceArray,int headIndex,int endIndex) {
        //需要排序的序列至少得有俩,
        // 否则没有意义。
        if (endIndex > headIndex) {
            int referenceElement = sourceArray[headIndex];
            int headPointer = headIndex;
            int endPointer = endIndex;
            while (headPointer < endPointer) {
                while (sourceArray[endPointer] > referenceElement && headPointer < endPointer)
                    endPointer--;
                while (sourceArray[headPointer] <= referenceElement && headPointer < endPointer)
                    headPointer++;
                if (headPointer < endPointer) {
                    int tempElement = sourceArray[endPointer];
                    sourceArray[endPointer] = sourceArray[headPointer];
                    sourceArray[headPointer] = tempElement;
                }
            }
            sourceArray[headIndex] = sourceArray[headPointer];
            sourceArray[headPointer] = referenceElement;
            QuickSort.divideGroup(sourceArray,headIndex,headPointer - 1);
            QuickSort.divideGroup(sourceArray,headPointer + 1,endIndex);
        }
    }
}

相关文章

  • 排序算法总结

    选择排序法 插入排序法 冒泡排序法 归并排序法 自顶向下 自底向上 快速排序法 单路快速排序法 双路快速排序法 三...

  • iOS常见算法

    升序算法:用冒泡排序法 选择排序法 快速排序

  • 排序算法篇_快速排序法

      快速排序(Quick Sort)法和冒泡排序法类似,都是基于交换排序思想的。快速排序对冒泡排序法进行了改进,从...

  • 《python算法教程》Day9 - 快速排序法

    这是《python算法教程》第9篇读书笔记,笔记的主要内容为快速排序法。 快速排序法简介 快速排序法运用分治法的方...

  • 排序算法

    排序算法分类 排序算法常用主要有:冒泡排序法、快速排序法、选择排序法、插入排序法、堆排序法、归并排序法等几种。 ...

  • php实现几种常见的排序方法

    1. 冒泡排序法: 2. 选择排序法: 3.插入排序法: 4.快速排序法:

  • 3种排序

    冒泡排序 插入排序 快速排序法

  • js 常见排序算法(快速排序,选择排序等)

    快速排序法 选择排序 插入排序 冒泡排序

  • 常用的排序算法

    1. 冒泡排序: 2.快速排序法 3.插入排序法 4.选择排序法 5.归并排序法

  • 数组相关处理函数2

    冒泡排序法 快速排序法 数组排序函数 ksort 对数组按照键名排序 krsort 键名降序排序 asort 对数...

网友评论

      本文标题:快速排序法

      本文链接:https://www.haomeiwen.com/subject/zlqmzxtx.html