5.图解排序算法(五)之快速排序——三数取中法

作者: dreamcatcher-cx
出处: http://www.cnblogs.com/chengxiao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在页面明显位置给出原文链接。

原文链接:https://www.cnblogs.com/chengxiao/p/6262208.html
图解排序算法(五)之快速排序——三数取中法

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
基本步骤

三数取中

在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。

在这里插入图片描述

根据枢纽值进行分割

在这里插入图片描述
 在这里插入图片描述

代码实现

复制代码
package sortdemo;

import java.util.Arrays;

/**

  • Created by chengxiao on 2016/12/14.

  • 快速排序
    */
    public class QuickSort {
    public static void main(String[] args) {
    int[] arr = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
    quickSort(arr, 0, arr.length - 1);
    System.out.println(“排序结果:” + Arrays.toString(arr));
    }

    /**

    • @param arr
    • @param left 左指针
    • @param right 右指针
      */
      public static void quickSort(int[] arr, int left, int right) {
      if (left < right) {
      //获取枢纽值,并将其放在当前待处理序列末尾
      dealPivot(arr, left, right);
      //枢纽值被放在序列末尾
      int pivot = right - 1;
      //左指针
      int i = left;
      //右指针
      int j = right - 1;
      while (true) {
      while (arr[++i] < arr[pivot]) {
      }
      while (j > left && arr[–j] > arr[pivot]) {
      }
      if (i < j) {
      swap(arr, i, j);
      } else {
      break;
      }
      }
      if (i < right) {
      swap(arr, i, right - 1);
      }
      quickSort(arr, left, i - 1);
      quickSort(arr, i + 1, right);
      }

    }

    /**

    • 处理枢纽值
    • @param arr
    • @param left
    • @param right
      */
      public static void dealPivot(int[] arr, int left, int right) {
      int mid = (left + right) / 2;
      if (arr[left] > arr[mid]) {
      swap(arr, left, mid);
      }
      if (arr[left] > arr[right]) {
      swap(arr, left, right);
      }
      if (arr[right] < arr[mid]) {
      swap(arr, right, mid);
      }
      swap(arr, right - 1, mid);
      }

    /**

    • 交换元素通用处理
    • @param arr
    • @param a
    • @param b
      */
      private static void swap(int[] arr, int a, int b) {
      int temp = arr[a];
      arr[a] = arr[b];
      arr[b] = temp;
      }
      }
      复制代码
      排序结果

排序结果:[1, 2, 3, 4, 5, 6, 7, 8]
总结

快速排序是一种交换类的排序,它同样是分治法的经典体现。在一趟排序中将待排序的序列分割成两组,其中一部分记录的关键字均小于另一部分。然后分别对这两组继续进行排序,以使整个序列有序。在分割的过程中,枢纽值的选择至关重要,本文采取了三位取中法,可以很大程度上避免分组"一边倒"的情况。快速排序平均时间复杂度也为O(nlogn)级。

作者: dreamcatcher-cx
出处: http://www.cnblogs.com/chengxiao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在页面明显位置给出原文链接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍排序算法,并给出它们排序任意12个数字的过程图解。 1. 冒泡排序 冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就将它们交换过来。 以下是冒泡排序对任意12个数字的排序过程图解: ![冒泡排序过程图解](https://img-blog.csdnimg.cn/20220118150738851.PNG) 2. 选择排序 选择排序是一种简单直观的排序算法,它的工作原理是每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 以下是选择排序对任意12个数字的排序过程图解: ![选择排序过程图解](https://img-blog.csdnimg.cn/20220118150745497.PNG) 3. 插入排序 插入排序是一种简单直观的排序算法,它的工作原理是将待排序的数据元素按照大小插入到已经排好序的数据元素中。 以下是插入排序对任意12个数字的排序过程图解: ![插入排序过程图解](https://img-blog.csdnimg.cn/2022011815075636.PNG) 4. 快速排序 快速排序是一种常用的基于分治思想的排序算法,它的工作原理是通过一趟排序将待排序列分成两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 以下是快速排序对任意12个数字的排序过程图解: ![快速排序过程图解](https://img-blog.csdnimg.cn/20220118150808201.PNG) 5. 归并排序 归并排序是一种基于分治思想的排序算法,它的工作原理是将原始序列划分成若干个子序列进行递归排序,然后将排序后的子序列再合并成一个有序序列。 以下是归并排序对任意12个数字的排序过程图解: ![归并排序过程图解](https://img-blog.csdnimg.cn/20220118150816691.PNG) 以上是排序算法对任意12个数字的排序过程图解,您可以对比它们的不同之处,选择适合您的应用场景的算法进行使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值