当前位置: 首页 > news >正文

排序算法之-快速

算法原理

丛待排序的数列中选择一个基准值,通过遍历数列,将数列分成两个子数列:小于基准值数列、大于基准值数列,准确来说还有个子数列:等于基准值即:
在这里插入图片描述

算法图解

  1. 选出基准元素pivot(可以选择最左侧元素),设置两个指针(Java中可看成是数组索引)left和right,left指向数列最左边的元素,right指向最右侧元素
  2. 进行第一次遍历,先丛right指针开始,让其指向的元素和pivot作比较,大于或等于则指针向左移动一个位置,小于则停止移动,等待left指针移动
  3. 轮到left指针移动,同样先让left指向的元素和pivot做比较,小于或等于则指针向右移动,大于则停止移动
  4. 此时left和right都停止移动,判断left和right是否在同一个位置,否则交换位置元素。
  5. 继续丛2开始,直至left和right相交,将pivot值与left指向的元素进行交换,第一次遍历结束,获得分区指针left。
  6. 再将两个子数列按照1到6的步骤继续执行,直至所有子数列排序完成。
    在这里插入图片描述

算法实现

public class QuickSort {public void sort(int []arr){doSort(arr,0,arr.length-1);}public void doSort(int []arr,int left,int right){if(left >= right){return;}int partitionIndex = partition(arr, left, right);doSort(arr,left,partitionIndex-1);doSort(arr,partitionIndex+1,right);}/*** 右指针先往左移动* @param arr* @param left* @param right* @return*/public int partition(int []arr,int left,int right) {int startIndex = left;int pivot = arr[startIndex];while (left < right) {while (left < right && arr[right] >= pivot) {right--;}while (left < right && arr[left] <= pivot) {left++;}if (left < right) {swap(arr, left, right);}}swap(arr, startIndex, left);return left;}private void swap(int arr[],int i,int j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}

测试

  public static void main(String[] args) {int arr[] = {9, 7, 1991, 27, -1, -10, 0,10,9,8,-1,27,-1, 2, 65, -100};new QuickSort().sort(arr);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + "\t");}}

结果

在这里插入图片描述

分区实现2

  /*** 左指针先往右移动* @param arr* @param left* @param right* @return*/public int partition(int []arr,int left,int right){int startIndex = left;int pivot = arr[startIndex];while (left < right) {while (left < right && arr[left] <= pivot) {left++;}while (left < right&&arr[right] >= pivot){right --;}if(left < right){swap(arr,left,right);}}if(arr[left] >= pivot){swap(arr,startIndex,left-1);return left-1;}swap(arr,startIndex,left);return left;}
http://www.lryc.cn/news/230320.html

相关文章:

  • [vim]Python编写插件学习笔记2 - 分离
  • 【已解决】ModuleNotFoundError: No module named ‘kornia‘
  • 预览PDF并显示当前页数
  • 阿里云优惠券介绍、作用、领取入口及使用教程
  • Shell编程--流程控制
  • 设计模式-模板方法模式(Template Method)
  • 远程登录Linux方法(Linux平台相互远程;Windows远程登录Linux、远程编码、文件传输;无法远程登录的问题解决;c程序的编译)
  • macOS 13.6 及后续系统安装 Asahi Linux 将破坏引导
  • Python武器库开发-flask篇之flask框架的安装(二十一)
  • 【CASS精品教程】打开cass提示base.dcl未找到文件的解决办法
  • [vim]Python编写插件学习笔记3 - 命令行参数
  • 【仙逆】王林400年晋升元婴,复仇藤化元杀尽藤姓,高老畏罪自裁
  • 云原生实战课大纲
  • 数据湖架构
  • Zabbix 5.0部署(centos7+server+MySQL+Apache)
  • YOLO改进系列之注意力机制(CloAttention模型介绍)
  • openssl+AES开发实例(linux)
  • FreeRTOS源码阅读笔记3--queue.c
  • 云原生Kubernetes系列 | 通过容器互联搭建wordpress博客系统
  • java读取OPC DA数据---Utgard
  • 在 Android 上简单安全地登录——使用凭证管理器和密钥
  • 【Python】上市公司数据进行经典OLS回归实操
  • 科研学习|科研软件——有序多分类Logistic回归的SPSS教程!
  • 微服务简单理解与快速搭建
  • QColorDialog开发实例
  • linux实现全局快捷键
  • 共享台球室小程序系统:智能化预约与管理
  • 百度文心一言
  • 225.用队列实现栈(LeetCode)
  • 汽车FMCW毫米波雷达信号处理流程(推荐---基础详细---清楚的讲解了雷达的过程---强烈推荐)