一、快速排序

选取待排序数组的任意一个数据作为基准值,遍历数组中的元素。将小于基准值的元素放在基准值的左边,大于基准值的放在基准值的右边,将基准值放在中间,此时基准值到达了最终位置。然后对基准值左边的子数组和右边的子数组采用同样的方式进行处理,直到区间缩小为1,就说明数组有序

二、单路排序

例题:给定一长度为10的数组{6,1,2,7,9,3,4,5,10,8}

解题步骤;

(1)快速排序的思想为将数组首元素6移动至序列的某一位置M,让M左侧的元素均<=6,M的右侧元素均>=6;因此我们需定义两个指针i和j分别位于序列的首尾;

(2)i依次向后移动(i++)移动至大于6的元素停下,j向前移动(j--)移动至小于6的元素,并将i,j对应的元素交换。

(3)依照(2)的步骤依次遍历直到i,j重合;又因重合时所指元素为3,3<6两者交换;此时6的左边均小于6,6的右边均大于6。

(4)此时的序列元素6的左边均小于6,右边均大于6;取6的左部分重复(1)(2)(3)的步骤直到序列首元素为1;

(5)6的右部分也和左部分同理;

(7)代码实现;由(1)~(6)可知实现步骤一直是在重复,因此利用递归方法。

void Quick_Sort(int *arr, int begin, int end){if(begin > end)return;int tmp = arr[begin];int i = begin;int j = end;while(i != j){while(arr[j] >= tmp && j > i)j--;while(arr[i] <= tmp && j > i)i++;if(j > i){int t = arr[i];arr[i] = arr[j];arr[j] = t;}}arr[begin] = arr[i];arr[i] = tmp;Quick_Sort(arr, begin, i-1);Quick_Sort(arr, i+1, end);
}

三、双路排序

之前说的快速排序算法是将>v和<v两个部分元素都放在索引值i所指向的位置的左边部分,而我们的双路快速排序算法则不同,他使用两个索引值(i、j)用来遍历我们的序列,将<v的元素放在索引i所指向位置的左边,而将>v的元素放在索引j所指向位置的右边。

(1)代码实现;

 import java.util.Arrays;
import java.util.Random;public class QuickSort {private static Random random;private QuickSort() {}public static <E extends Comparable<E>> void sort2ways(E[] arr) {random = new Random();sort2ways(arr, 0, arr.length - 1);}private static <E extends Comparable<E>> void sort2ways(E[] arr, int l, int r) {if (l >= r) {return;}int p = partition2(arr, l, r);sort2ways(arr, l, p - 1);sort2ways(arr, p + 1, r);}private static <E extends Comparable<E>> int partition2(E[] arr, int l, int r) {// 生成[l,r]之间的随机索引int p = l+random.nextInt(r-l+1);swap(arr,l,p);// arr[l+1...i-1]<= v;arr[j+1...r]>=vint i = l+1,j = r;while (true){while (i<=j && arr[i].compareTo(arr[l])<0)i++;while (j>=i && arr[j].compareTo(arr[l])>0)j--;if (i>=j)break;swap(arr,i,j);i++;j--;}swap(arr,l,j);return j;}}

四、三路排序

将整个数组按照划分值v,分成小于v的区域称为小于区,等于v的区域等于区和大于v的区域大于区三部分,在下一次的递归中就不必再处理等于v的等于区,因为等于区的元素已经到达了最终位置,对于存在大量等于v的数组三路快排大大提升了效率。

(1)代码实现

import java.util.*;public class QuickSort3Ways {// 递归使用快速排序,对arr[l...r]的范围进行排序private static void sort(Comparable[] arr, int l, int r){// 对于小规模数组, 使用插入排序if( r - l <= 15 ){InsertionSort.sort(arr, l, r);return;}// 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivotswap( arr, l, (int)(Math.random()*(r-l+1)) + l );Comparable v = arr[l];int lt = l;     // arr[l+1...lt] < vint gt = r + 1; // arr[gt...r] > vint i = l+1;    // arr[lt+1...i) == vwhile( i < gt ){if( arr[i].compareTo(v) < 0 ){swap( arr, i, lt+1);i ++;lt ++;} else if( arr[i].compareTo(v) > 0 ){swap( arr, i, gt-1);gt --;} else{ // arr[i] == vi ++;}}swap( arr, l, lt );sort(arr, l, lt-1);sort(arr, gt, r);}public static void sort(Comparable[] arr){int n = arr.length;sort(arr, 0, n-1);}private static void swap(Object[] arr, int i, int j) {Object t = arr[i];arr[i] = arr[j];arr[j] = t;}}

快速排序(详细图解 单路、双路、三路)相关推荐

  1. 基于CubeMX-STM32F103RCT6_单通道双路PWM互补输出

    文章目录 基于CubeMX-STM32F103RCT6_单通道双路PWM互补输出 简介 CubeMX-TIM配置详情 单通道双路 PWM 互补输出配置 参数配置 时钟配置 工程管理 修改代码 基于Cu ...

  2. TC358775XBG转换芯片:MIPI DSI转LVDS(单路/双路)

    功能:TC358775XBG是一颗将MIPI DSI信号转换成single/ dual -link LVDS的芯片,最高分辨率支持到1920x1200,其应用图如下: 产品特征: MIPI接口: (1 ...

  3. 双路cpu比单路强多少_电源单路好还是双路好?电脑电源单路和双路12V详细区别对比...

    在一些比较大功率的电源中,经常可以看到分为单路12V和双路甚至是多路12V两种规格.那么,电源单路好还是双路好呢,很多网友搞不清这个问题.下面"脚本之家"以最通俗易懂的描述,带大家 ...

  4. 双路cpu比单路强多少_双路cpu比单路强多少

    单路双路通常是指的线程数. 双线程的意思就是一个物理CPU虚拟成两个CPU.有两个线程同时运行. 相对来讲性能会有所提升. 而且在系统里显示CPU是两个. 双核. 哪一个维护起来比较方便?比如配件适用 ...

  5. 信息机房双核与双路服务器的区别,双路和双核的区别 - 卡饭网

    关于CPU单核单路/双路和双核双路的区别 关于CPU单核单路/双路和双核双路的区别 双核处理器是指在一个处理器上集成两个运算核心,从而提高计算能力."双核"的概念最早是由IBM.H ...

  6. 快速排序 详解(快速排序 双路快排 三路快排)

    注:内容,图片来自于慕课网liuyubobobo老师的课程.  官方代码链接:https://github.com/liuyubobobo/Play-with-Algorithms 快速排序 快速排序 ...

  7. 双路快速排序以及三路排序算法

    目录 双路快速排序 一.概念及其介绍 二.适用说明 三.过程图示 四.Java 实例代码 三路排序算法 一.概念及其介绍 二.适用说明 三.过程图示 四.Java 实例代码 双路快速排序 一.概念及其 ...

  8. 深入理解快速排序(随机快排、双路快排、三路快排)

    快速排序可以说是20世纪最伟大的算法之一了.相信都有所耳闻,它的速度也正如它的名字那样,是一个非常快的算法了.当然它也后期经过了不断的改进和优化,才被公认为是一个值得信任的非常优秀的算法. 本文将结合 ...

  9. 双路服务器单路运行,双路服务器和单路服务器有什么区别?

    双路服务器和单路服务器的区别,有三点,区别一是在CPU上的区别,区别二是在执行效率上的区别,区别三是在内存在的区别,接下来的文章来详细的讲解一下这三点的区别. 区别一:CPU的区别 大家都知道双路服务 ...

最新文章

  1. Kafka: Connect
  2. (二)线程同步_3---在类中使用相互独立的属性同步
  3. hp服务器raid一直显示同步,HP Netserver NetRAID 一致性检查常见问题解答(FAQ)
  4. 常用脚本--在线重建或重整实例下所有索引
  5. OpenCV-高斯滤波cv::GaussianBlur
  6. HDF5: Python 的h5py与Julia的HDF5库读取效率比较,不差上下
  7. 阿里云国际站代理商:SCDN的抗CC攻击和抗DDoS攻击防护是什么?
  8. W5500以太网控制器芯片(五):实现FTP客户端
  9. AMS:startActivity桌面启动应用
  10. Win10安装Ruby
  11. logisim实验三:原码一位乘法器设计实验
  12. 电脑程序员需要考证件吗
  13. 消费金融公司可开展哪些业务类型?
  14. 电脑如何打开软键盘,教大家Win10如何打开软键盘的方法
  15. 专访 | 宋星 10 年启示录:数字营销如何觐见下一个 10 年?
  16. Mac安装激活 MATLAB R2018a
  17. python如何对两个矩阵进行拼接_Python:合并两个numpy矩阵的实现
  18. 好用的综合bim插件:Revit属性对话框中“视图范围”命令的使用
  19. 对动量守恒定律的质疑
  20. TCP/IP相关的那些事儿

热门文章

  1. 解析网页后门与网页挂马原理
  2. 如何取消锁定计算机,怎么设置电脑锁定状态下无法关闭电脑呢?
  3. 开关直流稳压电源/可调直流稳压电源电路设计
  4. python微博发送视频_Python:通过命令行发送新浪微博
  5. Web自动化工具对比
  6. 【数据结构与算法】常见数据结构及基本操作
  7. 微信小程序-显示自己发布的内容
  8. LHL'PTA 实验2. 前8章实验综合训练(2)
  9. 计算机常用端口号大全
  10. java中int与char之间的互相转化