美文网首页
Java快速排序

Java快速排序

作者: 徘徊0_ | 来源:发表于2018-10-09 09:08 被阅读0次

记录一下自己学习快速排序的过程,以及遇到的问题

快速排序思想:找到一个基准值(常从最左侧头开始),遍历所有数据,将比基准值小的,都放到基准值左侧,比基准值大的放到基准值右侧,第一次循环完成,然后递归调用该方法即可。

通过下面的例子,说明一下快速排序的过程,现在有一个原数据12 3 11 21 34 6 22进行快速排序:

步骤一:

首先取出一个基准(pivot)一般为第0位上的元素也就是:12
取出后,此时的0位变为一个空位

注:下图的 i :从左向右查找 j:从右向左查找

步骤1.png
步骤二:

此时 i 为空位,需要找 j 要一个数据来填满,j 需要从右向左找一个比12小的数据,也就是下面的6。


步骤二.png 交换之后的位置.png
步骤三:
步骤三.png
步骤四:
步骤四.png

注:当 i j 相遇的时候,就停止。此时左侧都是比基准 12 小的,右侧都是比基准12 大的,然后递归继续进行排序!

Java 代码实现

public class QuickSort {


    public static void quickSort(int[] arr, int start, int end) {
        if (start>end) return ;

        int left = start;
        int right = end;
        int pivot = arr[start];//基准

        while (left < right) {
            //从右向左,找到比基准小的数据
            while (left < right && arr[right] >= pivot) {
                right--;
            }

            //从左向右找到比基准大的数据
            while (left < right && arr[left] <= pivot) {
                left++;
            }
            
            //位置交换
            int tem = arr[left];
            arr[left] = arr[right];
            arr[right] = tem;
        }

        //将left 和 right 相遇的位置,和基准值进行交换
        arr[start] = arr[left];
        arr[left] = pivot;

        //此时不需要再讲基准位置写进去
        quickSort2(arr, start, left - 1);

        quickSort2(arr, right + 1, end);
    }

    //主方法
    public static void main(String[] args) {
        int[] arr= {12, 3, 11, 21, 34, 6, 22};
        // 调用快速排序方法
        quickSort(arr, 0, arr.length - 1);

         System.out.println(Arrays.toString(arr));
    }
}

输出结果:


排序结果.png

为什么快速排序必须要从右侧开始?

回头来复习快速排序的时候,本人习惯性的从左侧开始,发现运行结果不对发现了这个坑,原因如下:

  • 快速排序思想是,找到基准,左侧值都比基准小,右侧值都比基准大
  • 如果你先从左侧开始,从左侧开始查找比 基准小的值,此时遇到比基准大的值会继续往右查找,会影响从右向左找比基准小的值的过程 违背了快速排序的思想

相关文章

  • 快速排序

    快速排序Java实现

  • java排序方法资料

    java排序,效率高的是哪种排序方法 JAVA快速排序(高效) java中常用的几种排序算法 相关代码: /* *...

  • 数据结构&算法(一)

    一、Java实现快速排序算法 二、Java实现折半插入排序算法 三、Java实现冒泡排序算法

  • 面试知识点

    排序冒泡排序快速排序选择排序插入排序二路归并 查找二分查找 排序和查找的java实现 java语言Java字符串字...

  • 快速排序

    手写java版快速排序算法实现

  • 常见排序的java实现

    常见排序的java实现 常见排序java实现 插入排序(二分插入排序) 希尔排序 快速排序(三数中值快排) 冒泡排...

  • 排序

    Java 排序(这里统一做从小到大排) 快速排序 · 快速排序用分而治之的思想。对于要排序的数据,选取最左边的...

  • 排序

    八大排序算法 一、归并排序 递归及非递归的JAVA实现 二、快速排序 快排算法JAVA实现 三、堆排序 堆排序堆排...

  • 常用排序算法的Java实现

    冒泡、插入、选择、归并、快速排序的Java实现

  • 排序算法Java实现

    本文会通过Java语言实现:冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序,希尔排序...

网友评论

      本文标题:Java快速排序

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