美文网首页
排序:快速排序

排序:快速排序

作者: Hammy | 来源:发表于2018-03-01 16:07 被阅读0次

快速排序是一种交换排序,他是稳定的排序,时间复杂度是nlogn,因为每次partition需要n个时间,共分为logn次.所以整体时间复杂度是nlogn.
它的核心是:找到一个索引,把小于它的数值放在它的左边,大于它的放在右边.然后依次将左边的数组和右边的数组进行递归.
这个索引最好是一个中位值,保证左右两遍的长度差值不大,否则会导致整体时间复杂度变高.
Ps:左右两边进行交换的时候不能使用swap,这样会把mid值弄丢.因为为了避免出现相等情况的死循环,在遇到相等数值的情况下,会继续跳跃不能进行交换.
所以采用直接赋值的方案,这种方法可以实现解决这个问题.
至于为什么可以解决这个问题,可以用数学方法证明出来.(我还没有领会!!)

package Sort;

/**
 * Created by Hammy on 2018/3/1.
 */
public class QuickSort
{
    public QuickSort(){};

    public static void sort(int[] array){
        quickSort(array,0,array.length-1);
    }
    private static void quickSort(int[] array,int left,int right){
        if(left >= right)
            return;

        int index = partition(array,left,right);
        quickSort(array,left,index-1);
        quickSort(array,index+1,right);
    }

    private static int partition(int[] array, int left, int right){
        int mid = getMid(array, left, right);
        int temp = array[mid];

        while(left<right){
            while(right>left&&array[right]>=temp)
                right--;

            array[left]=array[right];

            while(left<right&&array[left]<=temp)
                left++;

            array[right]=array[left];
        }

        array[left]=temp;
        return left;
    }

    public static int getMid(int[] array,int left,int right){
        int mid = (left+right)>>1;

        if(array[left]>array[right]){
            Util.swap(array,left,right);
        }
        if(array[mid]>array[right]){
            Util.swap(array,mid,right);
        }
        if(array[mid]>array[left]){
            Util.swap(array,left,mid);
        }
        return left;
    }

}

相关文章

  • 面试准备--排序

    堆排序 快速排序(simple) 快速排序(regular) 归并排序 Shell排序 插入排序 选择排序 冒泡排序

  • 排序

    插入排序 选择排序 冒泡排序 归并排序 快速排序* 三路快速排序

  • Datawhale | 编程第6期 Test 3

    排序 1.实现归并排序、快速排序、插入排序、冒泡排序、选择排序、堆排序(选做) 归并排序 快速排序 插入排序 冒泡...

  • 七大排序算法之快速排序

    七大排序算法之快速排序 @(算法笔记)[排序算法, 快速排序, C++实现] [TOC] 快速排序的介绍: 快速排...

  • 图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序

    图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序 图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序

  • OC数据结构&算法

    更多整理资料尽在?一平米小站 目录 选择排序 冒泡排序 插入排序 快速排序 双路快速排序 三路快速排序 堆排序 选...

  • 常见排序算法

    这里介绍四种排序算法,选择排序、快速排序、归并排序、计数排序 选择排序(使用递归) 选择排序(使用循环) 快速排序...

  • 排序算法

    冒泡排序 选择排序 插入排序二分插入排序希尔排序 堆排序 归并排序 快速排序 交换排序类:冒泡排序快速排序 选择排...

  • 算法笔记01-排序#2

    快速排序敢叫快速排序,那它一定得快。 快速排序 概述 快速排序也是分治排序的典型,它快,而且是原地排序。不过,要防...

  • php-归并排序、快速排序、堆排序

    归并排序、快速排序、堆排序 时间复杂度 O(nlogn) 归并排序 快速排序(快排) 堆排序

网友评论

      本文标题:排序:快速排序

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