【排序】快速排序、归并排序详解

server/2025/3/19 5:19:58/

引言

说到常见的算法>排序算法,那肯定少不了快速排序和归并排序,因为这两个都是时间复杂度为Ologn的算法>排序算法,下面来说说这两种算法的思路以及注意事项

快速排序

思路

  1. 任意选取一个数记为pivot
  2. 对数组进行划分,根据选取的pivot将数组划分成小于pivot的部分和大于pivot的部分
  3. 递归求解小于pivot和大于pivot的部分

思考:2个数有序的定义是不是就是 左边的数小于右边的数,或者3个数有序的定义是不是就是,中间的那个数大于左边,小于右边,
所以可以猜到,快速排序核心其实就是递归到最小序列使其有序,使每一段序列都满足划分规则,到最后那就是整个序列有序

代码

class Solution {public int[] sortArray(int[] nums) {quickSort(nums,0,nums.length-1);return nums;}private void quickSort(int[] nums,int l,int r) {if (l >= r) return;int i = l,j = r;int pivot = nums[ThreadLocalRandom.current().nextInt(r - l + 1) + l];while(i<=j) {while(nums[i] < pivot) {i++;}while(nums[j] > pivot) {j--;}if(i <= j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;i++;j--;}}quickSort(nums, l, j);  quickSort(nums, i, r);  }}

归并排序

思路

分解(递归)阶段

  1. 将待排序数组不断二分,直到无法再分(每个子数组只有一个元素)
  2. 单个元素的数组天然是有序的,这是递归的"基本情况"

合并阶段

  1. 将两个已排序的子数组合并成一个有序数组
  2. 从最小的子数组开始,逐层向上合并
  3. 合并过程中保持元素的有序性
static void mergeSort(int[] nums, int l, int r) {if (l >= r) return;int mid = l + r >> 1;mergeSort(nums, l, mid);mergeSort(nums, mid + 1, r);int[] tmp = new int[r - l + 1];int i = l, j = mid + 1, k = 0;while (i <= mid && j <= r) {if (nums[i] <= nums[j]) {tmp[k++] = nums[i++];} else {tmp[k++] = nums[j++];}}while (i <= mid) {tmp[k++] = nums[i++];}while (j <= r) {tmp[k++] = nums[j++];}for (int ii = l, jj = 0; ii <= r; ii++, jj++) {nums[ii] = tmp[jj];}}

http://www.ppmy.cn/server/176160.html

相关文章

建筑兔零基础人工智能自学记录48|神经网络可视化Tensorflow-3

这次我们用一个可视化网站来理解神经网络A Neural Network Playground 打开可以看到以下界面&#xff1a; DATA一栏里提供了4种不同形态的数据&#xff0c;分别是圆形、异或、高斯和螺旋。平面内的数据分为蓝色和黄色两类。 我们先把隐藏层减少到最少&#xff0c;直接给两个数据…

【算法学习】位运算篇:位运算相关算法详解

前言&#xff1a; 位运算在我们平时刷算法题时出现的频率还是比较高的&#xff0c;它在很多场景中都能得到利用&#xff0c;下面本篇文章就将讲解一下Leetcode上面关于位运算的几道经典例题&#xff0c;以及位运算类题型的做题方法 目录 一、常见位运算总结 1.1 基础位运算 1…

【前端动态列表渲染:如何正确管理唯一标识符(Key)?】

前端动态列表渲染&#xff1a;如何正确管理唯一标识符&#xff08;Key&#xff09;&#xff1f; 在前端框架&#xff08;如 Vue、React&#xff09;中&#xff0c;渲染动态列表时&#xff0c;正确使用 key 是优化性能、避免状态错乱的关键。本文将基于实际开发场景&#xff0c…

Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实战指南

Spring Boot拦截器&#xff08;Interceptor&#xff09;与过滤器&#xff08;Filter&#xff09;深度解析&#xff1a;区别、实现与实战指南 一、核心概念对比 1. 本质区别 维度过滤器&#xff08;Filter&#xff09;拦截器&#xff08;Interceptor&#xff09;规范层级Serv…

【Go语言圣经2.5】

目标 了解类型定义不仅告诉编译器如何在内存中存储和处理数据&#xff0c;还对程序设计产生深远影响&#xff1a; 内存结构&#xff1a;类型决定了变量的底层存储&#xff08;比如占用多少字节、内存布局等&#xff09;。操作符与方法集&#xff1a;类型决定了哪些内置运算符…

Java 学习,查看端口使用与否

Java查看端口是否已被使用&#xff0c;通常涉及尝试绑定一个 ServerSocket 到指定的端口&#xff0c;并捕获可能抛出的 IOException 异常。如果绑定成功&#xff0c;则说明端口未被使用&#xff1b;如果抛出异常&#xff0c;则说明端口已被占用。 基本概念&#xff1a; 端口&…

SpringBoot 和vue前后端配合开发网页拼图10关游戏源码技术分享

今天分享一个 前后端结合 的网页游戏 开发项目源码技术。 这也是我第一次写游戏类的程序&#xff0c;虽然不是特别复杂的游戏&#xff0c;但是是第一次写&#xff0c;肯定要记录一下了&#xff0c;哈哈。 游戏的内容 就是 我们显示中玩的那个 拼图碎片的 游戏&#xff0c;类似下…

网络安全证书培训机构有哪些

一、前言少叙 记得刚入行的时候&#xff0c;想考一个证书来装装门面&#xff0c;结果发现费用太高了&#xff0c;比当时一个月的工资都高&#xff0c;感叹网络安全这帮人真舍得花钱&#xff0c;遂放弃。后来入职网络安全公司&#xff0c;考了一个CISP&#xff0c;在工作中逐渐…