强化历程7-排序算法(2023.9.12)

  • 此笔记学习图片来自于如下网址

1https://www.west999.com/info/html/chengxusheji/Javajishu/20190217/4612849.html

文章目录

  • 强化历程7-排序算法
    • 1 冒泡排序(交换排序)
    • 2 选择排序
    • 3 直接插入排序
    • 4 希尔排序
    • 5 归并排序
    • 6 快速排序
    • 7 堆排序
    • 8 计数排序

强化历程7-排序算法

1 冒泡排序(交换排序)

在这里插入图片描述

思想:每轮排序,相邻两个元素比较,如果后面元素小于前面元素,则位置颠倒;

  • 每轮可以确定一个最大值,下轮比较只需比较剩下的n-1个元素,排序结束后,退出循环。
    static int[] maopao(int[] arr) {int temp = 0;//交换位boolean flag = false;//标志位,记录有无交换//外层遍历控制遍历轮数for (int i = 0; i < arr.length - 1; i++) {flag = false; // 每轮排序开始时,将标志位重置为false//内层进行交换,并且下轮比较只需比较剩下的n-1个元素for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {//如果前面比后面大,交换位置flag = true;temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}if (!flag){//如果没交换break;}System.out.print("第" + i + "轮交换结果为:");for (int k : arr) {System.out.print(k + " ");}System.out.println("");}return arr;}
  • 时间复杂度:O(N^2),在冒泡排序中,每个元素需要和其他元素进行比较,因此总共需要进行 N^2 次比较操作。
  • 空间复杂度:O(1) ,在冒泡排序中,只需要使用一个临时变量进行数值交换,因此空间复杂度为 O(1)。

2 选择排序

在这里插入图片描述

思想:每轮对未排序元素选择一个最小(或最大的)的标记,放到未排序元素的最左边(或最右边)

       static int[] xuanze(int[] arr) {int temp; //交换位for (int i =0;i< arr.length-1;i++){int minIndex = i;//最小值下标//遍历未排序部分并最小的值for (int j = i+1; j < arr.length; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}// 将找到的最小值与未排序部分的第一个元素交换位置temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}return arr;}

改进思路:每轮找到未排序元素的最大值和最小值,将他们放到未排序元素两端

  • 时间复杂度:O(N^2)

  • 空间复杂度:O(1)

3 直接插入排序

在这里插入图片描述

思想:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

  1. 从第一个元素开始,该元素可以认为已经被排序;
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2~5。
    static int[] charu(int[] arr) {for (int i = 1; i < arr.length; i++) {//取出当前元素int currentNum = arr[i];int j = i - 1;  //定位当前元素//对于当前元素,让其从后往前扫描,找出正确位置while (j >= 0 && arr[j] > currentNum) {//比当前元素大的后移一位arr[j + 1] = arr[j];j--;}arr[j+1] = currentNum; //将当前元素插入合适位置}return arr;}
  • 时间复杂度

    • 最坏情况:每次插入每个元素都要挪动一次:O(N^2)
    • 最好情况:O(N)

    越接近顺序时间复杂度越低,元素越少效率越高,因为交换少,因此Arrays.sort()底层length<47为插入排序

  • 空间复杂度:O(1)

4 希尔排序

在这里插入图片描述

思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,然后依次缩减增量(gap)再进行排序,直到增量为1时,进行最后一次直接插入排序。

  • 相当与改进的直接插入排序,只不过原来间隔为1,改为现在的gap了,减少比较和移动的次数,从而提高排序效率。
     static int[] xier(int[] arr) {//将元素分组//增量gap设置为n/2,这意味着我们将数组分成多个子序列,每个子序列包含相隔一个增量的元素。for (int gap = arr.length / 2; gap > 0; gap /= 2) {//对分组进行插入排序for (int i = gap;i<arr.length;i++){int currentNum = arr[i];//当前元素int j =i; while (j>=gap&&arr[j-gap]>currentNum){// 将比当前元素大的元素向右移动一个增量arr[j] = arr[j - gap];j -= gap;}// 将当前元素插入到正确的位置arr[j] = currentNum;}}return arr;}
  • 时间复杂度:O(NlogN)
  • 空间复杂度:O(1)

5 归并排序

在这里插入图片描述

思想:归并排序的思想是将待排序序列分成若干个子序列,每个子序列都是有序的。然后,将这些有序的子序列合并成一个整体有序的序列。

  • 思路: 不停递归分解数组,当分解到自己则退出

    然后开始合并排序

public class guibing {static void guibingGroup(int[] arr, int left, int right) {//递归,相遇时退出,也就是分解遇到自己if (left >= right) {return;}//获取中间元素int mid = (left + right)/2;guibingGroup(arr, left, mid); //左边序列guibingGroup(arr, mid + 1, right);//右边序列//合并guibingheBing(arr, left, mid, right);}private static void guibingheBing(int[] arr, int left, int mid, int right) {int s1 = left;//归并左边第一个数据int s2 = mid + 1;//归并右边第一个数据int temp[] = new int[right - left + 1];int index = 0;//表示temp数组下标while (s1 <= mid && s2 <= right) {//两边都不为空//比较s1和s2的值if (arr[s1] <= arr[s2]) {//放到数组后,下个数字temp[index++] = arr[s1++];} else {temp[index++] = arr[s2++];}}while (s1 <= mid) {temp[index++] = arr[s1++];}while (s2 <= right) {temp[index++] = arr[s2++];}for (int  i=0;i< temp.length;i++){//右边元素放到自己的位置arr[i+left] = temp[i];}}
}
  • 时间复杂度 Nlog(NlogN)
  • 空间复杂度O(N)

6 快速排序

在这里插入图片描述

思想:从左边(或者右边)找一个基准数。

然后从两边开始检索,( 如果左边为基准数从右开始检索,如果右边为基准数从左边开始检索),一边检索出比基准数小的,另一边检索比基准数大的。

如果检索到就停下,然后交换这两个元素,然后再继续检索。

这两个元素一旦相遇则停止检索,把基准数和相遇位置的元素交换。(第一轮结束):左边元素都比基准数小,右边元素都比基准数大。。。

    private static void kuaipai(int[] arr, int left, int right) {//左边索引大于右边,直接返回if (left >= right) {return;}int base = arr[left];//基准数int i = left;//指向左边元素int j = right;//指向右边元素//i和j不相遇while (i != j) {//先由j从右往左检索比基准数小的,如果检索到比基准数小停止while (arr[j] >= base && i < j) {j--;}//先由i从左往右检索比基准数大的,如果检索到比基准数大停止while (arr[i] <= base && i < j) {i++;}//找到了对于数组,交换i和j位置的元素int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}//如果上述条件不成立,i和j相遇arr[left] = arr[i];arr[i] = base;//基准数在这里归位//排基准数左面kuaipai(arr,left,i-1);//排右边kuaipai(arr,j+1,right);}

7 堆排序

在这里插入图片描述

  • 下标为i的节点的父节点下标: (i- 1)/2

  • 下标为i的节点的左孩子下标:i*2+1

  • 下标为i的节点的右孩子下标:i*2+2

思想:子节点要小于父节点

    private static void duipai(int[] tree, int current, int length) {int left = 2 * current + 1; //左节点索引int right = 2 * current + 2;//右节点索引int maxIndex = current; //最大节点索引// 左节点大于最大值if (left < length && tree[left] > tree[maxIndex]) {maxIndex = left;}// 右节点大于最大值if (right < length && tree[right] > tree[maxIndex]) {maxIndex = right;}// 如果当前索引和最大索引不相等if (current != maxIndex) {int temp = tree[current];tree[current] = tree[maxIndex];tree[maxIndex] = temp;duipai(tree,maxIndex,length);}}

将任意树调整为大顶堆

从倒数第一个非叶子结点开始,从后往前,按下标,依次作为根去向下调整即可。

  	//构建大顶堆private static void buildMaxHeap(int[] tree){int lastNode = tree.length-1;int parent = (lastNode-1)/2;for (int k= parent;k>=0;k--){duipai(tree,k);}}

排序

重新构建大顶堆

private static void duiSort(int[] arr){  //重新构建大顶堆  buildMaxHeap(arr);  for (int i=arr.length-1;i>=0;i--){  //最大值放到数组最后  int temp = arr[0];  arr[0] = arr[i];  arr[i] = temp;  //将最大值砍掉  duipai(arr,0,i);  // 重新调整堆  if (i != 0) {  duipai(arr, 0, i);  }  } 

8 计数排序

在这里插入图片描述

思想:它的基本思想是通过计算各个数值出现的次数,然后根据这些次数重新组织待排序数组,从而实现排序。

   public static void jishu(int[] array) {//找出数组中的最大值int max = array[0];for (int i = 1; i < array.length; i++) {if (array[i] > max) {max = array[i];}}//初始化计数数组int[] countArray = new int[max + 1];//统计每个元素的出现次数for (int i = 0; i < array.length; i++) {countArray[array[i]]++;}//重新生成排序后的数组int index = 0;for (int i = 0; i < countArray.length; i++) {while (countArray[i] > 0) {array[index++] = i;countArray[i]--;}}}

  1. 1 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/136105.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

商业综合体AI+视频安防监控与智能监管解决方案

一、方案背景 商业综合体需要具备更好的品质和环境才能吸引更多客流&#xff0c;如何有效地进行内部管理、外部引流&#xff0c;是综合体管理人员思考的重点。 传统的视频监控需要靠人盯牢屏幕或者发生报警后通过查看录像&#xff0c;才能找到意外事件相关人员与起因&#xf…

4G模块驱动移植

一、4G模块概述 1、调试的模块型号是广和通的 NL668-EAU-00-M.2。 2、使用的接口是 M.2 Key-B。实际只用到了M2里的USB接口。 调试过程 以QMI_WWAN号方式进行说明&#xff0c;其他拨号方式也试过。最后以QMI_WWAN方式调通了&#xff0c;拨号成功了。 其他拨号方式因为现有文档…

通过Power Platform自定义D365CE业务需求 - 1. Microsoft Power Apps 简介

Microsoft Power Apps是一个趋势性的、无代码和无代码的商业应用程序开发平台,配有一套应用程序、服务和连接器。其数据平台为构建适合任何业务需求的自定义业务应用程序提供了快速开发环境。随着无代码、少代码应用程序开发的引入,任何人都可以快速构建低代码应用程序,并与…

linux系统报“INFO: task java:xxx blocked for more than 120 seconds.”解决办法

1、问题描述 linux系统&#xff0c;输入dmesg -T&#xff0c;报“INFO: task java:xxx blocked for more than 120 seconds.”&#xff0c;如下 一般情况下&#xff0c;linux会把可用内存的40%的空间作为文件系统的缓存。当缓存快满时&#xff0c;文件系统将缓存中的数据整体同…

安卓系列机型 另类体验第三方系统 DSU操作步骤解析 不影响主系统开启第二系统

dsu loader即 动态系统更新&#xff0c;可以在使用动态分区的安卓设备上&#xff0c;不影响原来系统的同时安装一个副系统&#xff0c;用于体验最新的原生安卓系统。可以不影响主系统的基础上体验其他gsi第三方。DSU 依赖于 Android 动态分区功能&#xff0c;并要求 GSI 作为可…

VRTK4⭐四.和 UI 元素交互

文章目录 &#x1f7e5; 安装Tilia Unity.UI&#x1f7e7; 配置射线与UI交互器1️⃣ 配置直线射线2️⃣ 配置UI交互器 &#x1f7e8; 配置UI1️⃣ 更新EventSystem2️⃣ 进行Canvas设置 我们要实现的功能: 右手触摸到圆盘:显示直线射线 右手圆盘键按下:与选中UI交互 &#x1f7…

分类散点图 stripplot() 加辅助线axhline() 多图合一

分类散点图 stripplot 加辅助线axhline 多图合一 效果图代码 画图没有什么可说的&#xff0c;直接上图 效果图 代码 # 绘制图&#xff0c; 查看是否数值在阈值上 plt.figure(figsize(30, 18)) n 0 for header, value_list in info_dict.items():ref_value_list ref_info_dic…

[S2] Challenge 25 心脏病预测

问题 您是一家医疗保健公司的数据科学家&#xff0c;试图创建患者是否患有心脏病的预测因子。目前&#xff0c;您正在试验 11 种不同的特征&#xff08;潜在心脏病指标&#xff09;和 XGBoost 分类模型&#xff0c;您注意到它的性能可能会根据其调整方式而发生很大变化。在此挑…

以矩阵的形式,对点或线段或多边形绕固定点旋转方法

一、仅旋转 &#xff0c;其中x,y旋转前横纵坐标&#xff0c;x’,y’为旋转后横纵坐标。θ旋转角度&#xff0c;单位为弧度。 等价于&#xff1a;x’ xcosθysinθ&#xff0c;y’-xsinθycosθ 注&#xff1a;此矩阵仅为旋转矩阵&#xff0c;不包含平移和缩放。 二、旋转平…

eclipse 源代码文件报错处理

用 eclipse 的 kepler 版本编译项目的时候没有提示、刷新之后发现居然 “新增” 了几个红叉。但是几分钟前还好好运行&#xff1b;都是从代码仓库更新来的、不可能报错。 看了文件最后的更新时间&#xff0c;更加确认了想法&#xff1a; 于是找一个无端报错的文件、随便加一个花…

【Linux】动静态库

目录 1.静态库2.动态库3.静态库的使用区别总结 1.静态库 我们在linux中已经帮我们下载好了C和C所需要的各种库&#xff0c;库也是文件&#xff0c;实际上就是各种接口的实现&#xff0c;我们在使用系统提供的譬如printf等函数时&#xff0c;就是使用系统中的库文件。使用一个库…

成功的海外网红营销:文化和价值观冲突的应对策略

随着全球数字化和社交媒体的崛起&#xff0c;海外网红营销已经成为企业推广产品和服务的一种重要方式。然而&#xff0c;这种全球性的营销活动也伴随着文化和价值观的多样性&#xff0c;容易导致潜在的冲突和误解。为了取得成功并避免不必要的争议&#xff0c;企业需要深入了解…

Solidity 小白教程:21. 调用其他合约

Solidity 小白教程&#xff1a;21. 调用其他合约 调用已部署合约 开发者写智能合约来调用其他合约&#xff0c;这让以太坊网络上的程序可以复用&#xff0c;从而建立繁荣的生态。很多web3项目依赖于调用其他合约&#xff0c;比如收益农场&#xff08;yield farming&#xff0…

北工大汇编——综合题(2)

题目要求 编写一个比赛得分程序。共有7 个评委&#xff0c;按百分制打分&#xff0c;计分 原则是去掉一个最高分和一个最低分&#xff0c;求平均值。要求&#xff1a; 评委的打分以十进制从键盘输入。成绩以十进制给出&#xff0c;并保留 1位小数。输入输出时屏幕上要有相应提…

Unity WebGL 编译 报错: emcc2: error: ‘*‘ failed: [WinError 2] ϵͳ�Ҳ���ָ�����ļ���解决办法

文章目录 错误日志可能的原因及解决办法:导出路径不能有中文系统名(win)含有中文, 修改环境变量Temp和Tmp, 如下图:真正的原因: 杀毒软件删除了部分wasm相关文件,如: 错误日志 Building Library\Bee\artifacts\WebGL\build\debug_WebGL_wasm\build.js failed with output: emc…

D*算法图文详解

前面学习了Dijkstra以及A* 算法的基本原理&#xff0c;对于这两种算法而言&#xff0c;我们都能在有解的情况下找到一条沿着起点到达终点的路径。然而&#xff0c;这两个算法本身都是基于静态地图的&#xff0c;也就是说&#xff1a;当机器人找到路径后开始沿着起点向终点运动的…

接口测试学习

1、curl 命令 无参&#xff1a;curl -X POST -H"Authorization: abcdefghijklmn" https://xxx.xxxxx.com/xxxx 有参&#xff1a;curl -X POST -H"Authorization:abcdefghijklmn " -H"Content-Type:application/json" https://xxx.xxxxx.com/…

【Java 集合】常用的Java集合体系(134)

一、集合的体系分类 分为单列集合&#xff0c;双列集合。和数组相比&#xff0c;大小可变更加灵活。

STM32 USB CDC 虚拟串口

// 用虚拟串口(USB CDC VCP)感觉有些不稳定&#xff0c;尤其是下位机掉电后再上电&#xff0c;上位机虚拟的那个串口根本不能用&#xff0c;还有就是 // 必须等虚拟串口出来后且知道串口号上位机才可以执行打开操作// 上面是实际情况&#xff0c;但并不是STM32的USB不行&#x…

Golang 基础面试题 01

Golang 面试题合集.png 背景 在之前的文章中分享了 k8s 相关的面试题&#xff0c;本文我们重点来讨论和 k8s 密切相关的 Go 语言面试题。 这几年随着云原生的兴起&#xff0c;大部分后端开发者&#xff0c;特别是 Java 开发者都或多或少的想学习一些 Go 相关的技能&#xff0c;…