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

快速排序总结

标准模版

交换法

单函数法

public static void quickSort(int[] arr, int start, int end) {if (start >= end) {return;}int idx = start;int pivot = arr[idx];int left = start, right = end;while (left < right) {while (left < right && arr[right] >= pivot) {right--;}while(left < right && arr[left] <= pivot) {left++;}swap(arr, left, right);}// 从此行开始,left == rightswap(arr, idx, left);if (start < left) {quickSort(arr, start, left - 1);}if (right < end) {quickSort(arr, right + 1, end);}
}

双函数法

/*** 快速排序* <p>* 这一层的逻辑基本不会变,注意递归退出条件** @param nums* @param start* @param end*/
public static void quickSort(int[] nums, int start, int end) {if (start < end) {int index = partition(nums, start, end);quickSort(nums, start, index - 1);quickSort(nums, index + 1, end);}
}/*** 交换法,即Hoare法** @param arr* @param start* @param end* @return*/
public static int partition(int[] arr, int start, int end) {int index = start;int pivot = arr[index];int left = start, right = end;while (left < right) {// 让right找比pivot小的数while (right > left && arr[right] >= pivot) {right--;}// 让left找比pivot大的数while (left < right && arr[left] <= pivot) {left++;}// 让left与right这两个数进行交换swap(arr, left, right);}// 将基准值放到合适的位置swap(arr, index, left);// 返回基准下标return left;
}private static void swap(int[] nums, int left, int right) {int tmp = nums[left];nums[left] = nums[right];nums[right] = tmp;
}

填坑法

【推荐】单函数法

代码量最少,且不需要swap函数;

public static void quickSort(int[] arr, int start, int end) {if (start >= end) {return;}int idx = start;int pivot = arr[idx];int left = start, right = end;while (left < right) {while (left < right && arr[right] >= pivot) {right--;}arr[left] = arr[right];while(left < right && arr[left] <= pivot) {left++;}arr[right] = arr[left];}// 从此行开始,left == rightarr[left] = pivot;if (start < left) {quickSort(arr, start, left - 1);}if (right < end) {quickSort(arr, right + 1, end);}
}

双函数法

/*** 快速排序* <p>* 这一层的逻辑基本不会变,注意递归退出条件** @param nums* @param start* @param end*/
public static void quickSort(int[] nums, int start, int end) {if (start < end) {int index = partition(nums, start, end);quickSort(nums, start, index - 1);quickSort(nums, index + 1, end);}
}/*** 填坑法** @param arr* @param start* @param end* @return*/
public static int partition(int[] arr, int start, int end) {int index = start;int pivot = arr[index];int left = start, right = end;while (left < right) {// 找到一个比基准小的值while (left < right && arr[right] >= pivot) {right--;}// 放到左边arr[left] = arr[right];// 找到一个比基准大的值while (left < right && arr[left] <= pivot) {left++;}// 放到右边arr[right] = arr[left];}// 基准放到位置上arr[left] = pivot;return left;
}

参考文档

快速排序(三)——hoare法

https://blog.csdn.net/fax_player/article/details/135719674

快速排序(四)——挖坑法,前后指针法与非递归

https://blog.csdn.net/fax_player/article/details/135750747

七大排序算法——快速排序,通俗易懂的思路讲解与图解(完整Java代码)

https://blog.csdn.net/The_emperoor_man/article/details/131706776

http://www.lryc.cn/news/379710.html

相关文章:

  • 探索Linux的奇妙世界:第二关---Linux的基本指令1
  • 荒野大镖客2启动找不到emp.dll的7个修复方法,轻松解决dll丢失的办法
  • 数据库精选题(三)(SQL语言精选题)(按语句类型分类)
  • Spring Boot + Apache Tika 实现文档内容解析
  • AcWing 255. 第K小数
  • Nginx - 反向代理、负载均衡、动静分离、底层原理(案例实战分析)
  • 从零开始精通Onvif之用户管理
  • 设计模式——设计模式原则
  • 链表中环的入口节点
  • STL——函数对象,谓词
  • 【区分vue2和vue3下的element UI Descriptions 描述列表组件,分别详细介绍属性,事件,方法如何使用,并举例】
  • atcoder abc 358
  • 手写docker:你先玩转namespace再来吧
  • 注册安全分析报告:PingPong
  • mysqladmin——MySQL Server管理程序(二)
  • Microsoft Edge无法启动搜索问题的解决
  • Appium Android 自动化测试 -- 元素定位
  • C#.net6.0+Vue+Ant-Design智慧医院手术麻醉系统源码 手术麻醉软件信息化管理系统 麻醉文书祥解
  • 6G时代,即将来临!
  • 进程、线程的区别
  • JWT详解、JWTUtil工具类的构建方法
  • 江协科技51单片机学习- p11 静态数码管显示
  • pandas.frame输出parquet
  • 【CT】LeetCode手撕—42. 接雨水
  • GPT-4o一夜被赶超,Claude 3.5一夜封王|快手可灵大模型推出图生视频功能|“纯血”鸿蒙大战苹果AI|智谱AI“钱途”黯淡|月之暗面被曝进军美国
  • C# + easyui 写的一个web项目
  • JVM 垃圾回收分配及算法
  • 尚品汇-(四)
  • colima配置docker镜像源
  • Linux_内核缓冲区