使用分割思想实现快速排序算法

本文记录快速排序算法的一个精美实现,关于其中的一些优化或者思路请参考如下资料:

快速排序中的分割算法的解析与应用

http://www.cnblogs.com/hapjin/p/5518922.html

http://blog.csdn.net/hapjin/article/details/49785477

http://blog.csdn.net/hapjin/article/details/49201341

public class QuickSort{

    //分割数组,将数组分成两部分. 一部分比pivot(枢轴元素)大,另一部分比pivot小
    private static int parition(int[] arr, int left, int right){

        int pivot = media3(arr, left, right);
        int i = left;
        int j = right - 1;//注意 ,在 media3()中 arr[right-1]就是 pivot

        //应对特殊情况下的数组,比如数组长度 小于3
        if(i >= j)
            return i;

        for(;;)
        {
            while(arr[++i] < pivot){}
            while(arr[--j] > pivot){}
            if(i < j)
                swap(arr, i, j);
            else
                break;
        }

        swap(arr, i, right-1);//restore pivot 将枢轴元素放置到合适位置:arr左边元素都比pivot小,右边都比pivot大
        return i;// 返回 pivot的 索引
    }

    //三数取中,用在快排中随机选择枢轴元素时
    private static int media3(int[] arr, int left, int right){
        if(arr.length == 1)
            return arr[0];

        if(left == right)
            return arr[left];

        int center = (left + right) / 2;

        //找出三个数中的最小值放到 arr[left]
        if(arr[center] < arr[left])
            swap(arr, left, center);
        if(arr[right] < arr[left])
            swap(arr, left, right);

        //将 中间那个数放到 arr[media]
        if(arr[center] > arr[right])
            swap(arr, center, right);

        swap(arr, center, right-1);//尽量将大的元素放到右边--将privot放到右边, 可简化 分割操作(partition).
        return arr[right-1];//返回中间大小的那个数
    }

    private static void swap(int[] arr, int left, int right){
        int tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
    }

    public static void quickSort(int[] arr){
        quickSort(arr, 0, arr.length - 1);
    }
    private static void quickSort(int[] arr, int left, int right){
        if(left < right){
            int pivot_index = parition(arr, left, right);
            quickSort(arr, left, pivot_index - 1);
            quickSort(arr, pivot_index + 1, right);
        }
    }

    public static void main(String[] args) {
        int[] arr2 = {1,0,-1};
        quickSort(arr2);
        for (int i : arr2) {
            System.out.print(i + " ");
        }
    }
}

不解释了,直接参考上面给出的参考链接即可。

时间: 2024-11-08 21:32:25

使用分割思想实现快速排序算法的相关文章

快速排序算法小结

         快速排序是对冒泡排序的一种改进.它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.          假设要排序的数组是a[6],长度为7,首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序.一躺快速排序的算法是: 1).设

快速排序算法

快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 稳定性:快速排序是不稳定的排序 时间复杂度: 最好:O(nlogn) 最差:O(n^2) 辅助空间:O(logn) ~ O(n) /* 快速排序算法 */ #include <cstdio> /* 对给定的闭区间进行快速排序 */ void QSort(int* L, int low, int high){ if (low

快速排序算法(Java)

快速排序算法的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. class PartitionSort{ public void p(int[] a){ //打印输出结果 for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } System.out.println(); } public int Parti

java算法系列之一:快速排序算法

1.算法概念. 快速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出. 2.算法思想. 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 3.实现思路. ①以第一个关键字 K 1 为控制字,将 [K 1 ,K 2 ,-,K n ] 分成两个子区,使左区所有关键字小于等于 K 1 ,右区所有关键字大于

Java快速排序算法

快速排序算法思想: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 用一个算法排序图形象表示了快速排序 一趟快速排序的算法是: 1)设置两个变量i.j,排序开始的时候:i=0,j=N-1: 2)以第一个数组元素作为关键

排序算法系列:快速排序算法

概述 在前面说到了两个关于交换排序的算法:冒泡排序与奇偶排序. 本文就来说说交换排序的最后一拍:快速排序算法.之所以说它是快速的原因,不是因为它比其他的排序算法都要快.而是从实践中证明了快速排序在平均性能上的确是比其他算法要快一些,不然快速一说岂不是在乱说? 本文就其原理.过程及实现几个方面讲解一下快速排序算法. 版权声明 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Coding-Naga 发表日期:2016年3月1日 链接:http://blog.csdn.n

递归方法理解快速排序算法

快速排序是对冒泡排序的一种改进.它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要 小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.最坏情况的时间复杂度为O(n2),最好 情况时间复杂度为O(nlog2n). 另外 java没指针概念 可以认为是句柄 假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所

快速排序算法详解与实现

快速排序是一种分治排序算法.广泛认为它是解决一般问题的最佳排序算法.同插入排序一样,快速排序也属于比较排序的一种,而且不需要额外的存储空间.在处理中到大型数据集时,快速排序是一个比较好的选择. 由于快速排序是一种分治算法,因此可以用分治法的思想将排序分为三个步骤 1.分:设定一个分割值将数据分为两部分. 2.治:分别在两部分用递归的方式继续使用快速排序法. 3.合:对分割部分排序排序直至完成. 实现代码如下: import java.util.Random; /** * 快速排序 {分,治,合}

面试指南 - 请实现一个快速排序算法

快速排序算法是诸多排序算法中性能较优的一种,也是很多内建排序类型所采用的算法.该算法在.NET面试和笔试中经常被考查到,下面将详细介绍快速排序的算法思想及代码示例. 所涉及的知识点: 使用C#实现快速排序算法 分析问题: 快速排序算法是公认的最为优秀的内部排序算法之一,其实实现思想很简单,并且在一般情况下性能较高.下面是该算法的基本思想: 假设待排序的序列为L[m...n],其中L[m...midlle-1]中的每个元素都小于L[midlle],而L[midlle+1...n]中的每个元素都大于