算法基础学习——快排与归并(附带java模版)

devtools/2025/2/3 10:17:40/

快速排序和归并排序是两种速度较快的排序方式,是最应该掌握的两种排序算法


(一)快速排序(不稳定的)

基本思想:分治

平均时间复杂度:O(nlogn) / 最慢O(n^2) / 最快O(n)

步骤:
  • 1.确定分界点;

  • 2.调整区间;(分界点右的元素全都小于等于分界点、左边全都大于等于分界点)

  • 3.递归的处理左右两段;

模板:
public static int[] quickSort(int[] arr,int l,int r){if(l>=r){return arr;}int k = arr[l+r >> 1],i=l-1,j=r+1;while(i<j){while(arr[++i]<k);while(arr[--j]>k);if(i<j){int temp = arr[i];arr[i]=arr[j];arr[j]=temp;}}quickSort(arr,l,j);quickSort(arr,j+1,r);
​return arr;}
​//TODO: 至少默写3-5遍(当前写了1遍)public static void main(String[] args) {int[] arr01 = {0,1};int[] arr02 = {1,2};int[] arr03 = {45, 78, 12, 67, 34, 90, 23, 56, 10};
​Scanner in = new Scanner(System.in);int n = in.nextInt();int[] arr04 = new int[n];for(int i=0;i<n;i++) {int num = in.nextInt();arr04[i] = num;}int[] res = quickSort(arr04, 0, n-1);System.out.println(Arrays.toString(res));}

注意点:

  • 注意i和j的初始值为:int i=l-1,j=r+1

  • 分界点k=arr[l+r >> 1]; 右移一位相当于除以二,右移2位是除以4;

(二)归并排序(稳定的)

基本思想:分治、从整个数组的中间开始划分

时间复杂度:稳定的O(nlogn)

步骤:
  1. 确定分界点mid = l+r >> 1;

  2. 递归排序左边和右边

  3. 归并(把两个有序数组合并为一个有序数组)

模板:
import java.util.*;public class Main{public static void mergeSort(int[] arr,int l,int r){//1.递归终止条件if(r<=l)return;//2.划分int mid = l+r>>1;mergeSort(arr,l,mid);mergeSort(arr,mid+1,r);//3.归并int tem[] = new int[r-l+1];int k=0,i=l,j=mid+1;while(i<=mid && j<=r){if(arr[i]<arr[j]) tem[k++] = arr[i++];else tem[k++] = arr[j++];}while(i<=mid) tem[k++] = arr[i++];while(j<=r) tem[k++] = arr[j++];//将临时数组中已经排好序的数据放到原数组(这里重复利用了之前定义过的i和j)for(i=l,j=0;i<=r;i++,j++){arr[i]=tem[j];}}public static void main(String[] args){Scanner in = new Scanner(System.in);int n = in.nextInt();int[] arr = new int[n];for(int i=0;i<n;i++){int num = in.nextInt();arr[i] = num;}mergeSort(arr,0,n-1);for(int i=0; i<n;i++){System.out.print(arr[i]+" ");}}
}


http://www.ppmy.cn/devtools/155691.html

相关文章

小程序设计和开发:如何研究同类型小程序的优点和不足。

一、确定研究目标和范围 明确研究目的 在开始研究同类型小程序之前&#xff0c;首先需要明确研究的目的。是为了改进自己的小程序设计和开发&#xff0c;还是为了了解市场趋势和用户需求&#xff1f;不同的研究目的会影响研究的方法和重点。例如&#xff0c;如果研究目的是为了…

基于单片机的盲人智能水杯系统(论文+源码)

1 总体方案设计 本次基于单片机的盲人智能水杯设计&#xff0c;采用的是DS18B20实现杯中水温的检测&#xff0c;采用HX711及应力片实现杯中水里的检测&#xff0c;采用DS1302实现时钟计时功能&#xff0c;采用TTS语音模块实现语音播报的功能&#xff0c;并结合STC89C52单片机作…

(9) 上:学习与验证 linux 里的 epoll 对象里的 EPOLLIN、 EPOLLHUP 与 EPOLLRDHUP 的不同

&#xff08;1&#xff09;经过之前的学习。俺认为结论是这样的&#xff0c;因为三次握手到四次挥手&#xff0c;到 RST 报文&#xff0c;都是 tcp 连接上收到了报文&#xff0c;这都属于读事件。所以&#xff1a; EPOLLIN : 包含了读事件&#xff0c; FIN 报文的正常四次挥手、…

Python-基于PyQt5,wordcloud,pillow,numpy,os,sys的智能词云生成器

前言&#xff1a;日常生活中&#xff0c;我们有时后就会遇见这样的情形&#xff1a;我们需要将给定的数据进行可视化处理&#xff0c;同时保证呈现比较良好的量化效果。这时候我们可能就会用到词云图。词云图&#xff08;Word cloud&#xff09;又称文字云&#xff0c;是一种文…

【PyQt】学习PyQt进行GUI开发从基础到进阶逐步掌握详细路线图和关键知识点

学习PyQt的必要性 PyQt是开发跨平台GUI应用的强大工具&#xff0c;适合需要构建复杂、高性能界面的开发者。无论是职业发展还是项目需求&#xff0c;学习PyQt都具有重要意义。 1. 跨平台GUI开发 跨平台支持&#xff1a;PyQt基于Qt框架&#xff0c;支持Windows、macOS、Linux…

第27篇:Python开发进阶:python多线程与多进程编程

第27篇&#xff1a;多线程与多进程编程 目录 并发编程概述 什么是并发编程多线程与多进程的区别 多线程编程 线程的基本概念创建和管理线程线程同步与锁 多进程编程 进程的基本概念创建和管理进程进程间通信 线程与进程的比较全局解释器锁&#xff08;GIL&#xff09; GIL的影…

对比DeepSeek、ChatGPT和Kimi的学术写作撰写引言能力

引言 引言部分引入研究主题&#xff0c;明确研究背景、问题陈述&#xff0c;并提出研究的目的和重要性&#xff0c;最后&#xff0c;概述研究方法和论文结构。 下面我们使用DeepSeek、ChatGPT4以及Kimi辅助引言撰写。 提示词&#xff1a; 你现在是一名[计算机理论专家]&#…

2025.2.1总结

今天又过了一天&#xff0c;过得确实太快了&#xff0c;走了一天的 亲戚。 过年对于小孩子是好事&#xff0c;对于成年人就不一样了。在外混得好的还好说&#xff0c;混得不好的过年真的是心累。这消息也太灵通了&#xff0c;怎么一个个都知道我已经出来上班了。今天不知道是第…