美文网首页
快速排序简单记录

快速排序简单记录

作者: Even_Wang | 来源:发表于2018-08-09 05:32 被阅读0次

快速排序是一个经典的排序算法,网上很多解释感觉都比较难以理解,经常看完之后过几天就忘了,这里主要简单谈下自己对快排算法的理解,并提供相对应的代码。

首先,快排是基于分治法的思想。算法主要有两个部分构成:
MergePartition .

Partition 部分是这个算法的核心,主要做的事情就是选择数组中一个数字当成关键字Key,然后将数组中所有比这个数小的数字移到Key的左边,将数组中比这个数字大的所有数字移动到Key的右边。

具体实现代码如下:

    public int partition(int[] nums, int left, int right){
        int key = nums[right];
        int startIndex = left;
        int smallIndex = startIndex;
        while(startIndex <= right-1){
            if(nums[startIndex]<key){
                if(startIndex!=smallIndex){
                   swap(nums,startIndex,smallIndex);
                }
                smallIndex++;
            }
            startIndex++;
        }
        if(smallIndex!=right) {
            swap(nums,smallIndex,right);
        }
        return smallIndex;
    }

这部分代码理解起来容易,具体实现却没有那么直白。我的做法是选择数组中最右边的那个数字做为Key, 然后用一个startIndex来从left到right-1遍历数组,把数组中所有比Key小的数字放在数组最左边, 并且用一个smallIndex来记录数组最左边可以放比Key小的数字的位置。这样当遍历完数组后,只要把key放到smallIndex的右边,就能保证数组中key左边的所有的元素比key小,key右边的所有元素比key大.

Merge 部分只需要根据 partition函数返回的 index,将数组划分成 left 到 index-1 部分和 index+1 到 right 部分,并且递归地调用MergeSort这个函数,这样当这两部分切分到只有一个元素或者为空的时候,把所有结果拼接起来,返回的结果就是Sort好的数组.

完整的代码实现如下:

  public void quickSort(int[] nums,int left,int right){
        if(nums==null || left>=right) return;
        int index = partition(nums,left,right);
        quickSort(nums,left,index-1);
        quickSort(nums,index+1,right);

    }

    public int partition(int[] nums, int left, int right){
        int key = nums[right];
        int startIndex = left;
        int smallIndex = startIndex;
        while(startIndex <= right-1){
            if(nums[startIndex]<key){
                if(startIndex!=smallIndex){
                   swap(nums,startIndex,smallIndex);
                }
                smallIndex++;
            }
            startIndex++;
        }
        if(smallIndex!=right) {
            swap(nums,smallIndex,right);
        }
        return smallIndex;
    }

    public void swap(int[] nums, int key1, int key2){
        int temp = nums[key1];
        nums[key1] = nums[key2];
        nums[key2] = temp;
        return;
    }

相关文章

  • 快速排序简单记录

    快速排序是一个经典的排序算法,网上很多解释感觉都比较难以理解,经常看完之后过几天就忘了,这里主要简单谈下自己对快排...

  • 排序

    简单排序: 插入排序 冒泡排序 快速排序 归并排序 基数排序

  • [iOS基础]OC常用算法实现

    希尔排序 快速排序 直接插入排序 简单选择排序 冒泡排序

  • 常用算法OC实现

    希尔排序 快速排序 直接插入排序 简单选择排序 冒泡排序

  • js经典算法记录

    随机数组洗牌 简单的日期字符串排序 递归实现数组扁平化 极简版数组扁平化 记录数组项重复次数 冒泡排序 快速排序(...

  • 常用排序算法(Python实现), 持续更新中

    一、非线性时间比较类排序 交换排序冒泡排序快速排序 插入排序简单插入排序希尔排序 选择排序简单选择排序堆排序 归并...

  • 排序算法

    Main 冒泡排序 快速排序 直接插入排序 希尔排序 简单选择排序 堆排序 归并排序

  • 排序算法----常见的排序算法

    1.冒泡排序 2.简单选择排序 3.直接插入排序 4.快速排序 快速排序 5.堆排序 堆排序 6.希尔排序 希尔排...

  • 【算法】常用的排序算法的Python实现

    jupyter notebook 导出的包括:插入排序/希尔排序;冒泡排序/快速排序;简单选择排序/堆排序;归并排...

  • 排序算法概述

    在本系列中我们综述十个常用排序算法,分别是简单插入排序、希尔排序、简单选择排序、快速排序、冒泡排序、堆排序、归并排...

网友评论

      本文标题:快速排序简单记录

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