图解Java排序算法之快速排序的三数取中法

作者:dreamcatcher-cx 时间:2022-02-26 17:58:23 

基本步骤

三数取中

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

图解Java排序算法之快速排序的三数取中法

根据枢纽值进行分割

图解Java排序算法之快速排序的三数取中法

图解Java排序算法之快速排序的三数取中法

代码实现


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]

来源:https://www.cnblogs.com/chengxiao/p/6262208.html

标签:Java,排序算法,快速排序,三数取中法
0
投稿

猜你喜欢

  • 优化MyBatis配置文件中的配置详解

    2023-11-10 14:03:51
  • Java数组与堆栈相关知识总结

    2023-11-12 06:12:18
  • Java基础之final关键字作用案例

    2022-11-02 19:23:35
  • AsyncTask官方文档教程整理

    2023-07-31 20:25:08
  • java通过方向键控制小球移动的小游戏

    2023-11-10 05:25:59
  • 通过实例解析JMM和Volatile底层原理

    2023-05-20 19:10:48
  • Java 获取网络302重定向URL的方法

    2022-03-25 15:19:46
  • Java中的Object类详细介绍

    2023-11-23 23:18:46
  • 基于spring security实现登录注销功能过程解析

    2023-11-29 06:09:05
  • jstorm源码解析之bolt异常处理方法

    2022-08-05 23:12:08
  • Spring Cloud Gateway(读取、修改 Request Body)的操作

    2023-11-09 19:25:46
  • Java实现扑克牌程序

    2023-11-11 12:09:52
  • java读取文件字符集示例方法

    2023-11-09 12:35:39
  • 基于Tomcat7、Java、WebSocket的服务器推送聊天室实例

    2023-11-25 23:35:34
  • Logback日志基础及自定义配置代码实例

    2022-09-04 01:01:41
  • Java Callable接口实现细节详解

    2023-11-10 05:34:26
  • springcloud项目占用内存好几个G导致服务器崩溃的问题

    2023-03-30 09:54:25
  • Java SoftReference类案例详解

    2023-04-07 06:52:29
  • SpringBoot结合JWT登录权限控制的实现

    2023-10-06 04:54:22
  • Zookeeper和Eureka哪个更好?

    2023-11-10 02:57:35
  • asp之家 软件编程 m.aspxhome.com