面试算法题—编程题2023

面试算法题—编程题2023

    • 一、冒泡排序
    • 二、选择排序
    • 三、快速排序
    • 四、其它排序

最近在看一些面试题,发现很多面试过程中都会要求手写排序编程题,经过一番查找整理,可以快速学习和使用相关排序算法题,通俗易懂,手撕代码吊打面试官。

一、冒泡排序

冒泡排序 是一种简单的排序算法,它重复地遍历待排序的数组,每次比较相邻的两个元素,如果顺序不对就交换它们。通过多次遍历,最终将待排序的数组按照从小到大或从大到小的顺序排列好。

冒泡排序的原理和过程
冒泡排序的原理很简单,每次比较相邻两个元素,如果前面的元素大于后面的元素,就交换它们。通过多次比较,最大(或最小)的元素会“浮”到数组的末尾,因此称为冒泡排序

用动态可视化图更好的去理解冒泡排序
在这里插入图片描述
java代码实现

 public class demo1 {public static void main(String[] args) {int[] a ={5,4,3,2,1};sort(a);for (int i = 0; i < a.length; i++) {System.out.print(a[i]);}}//冒泡排序//1.比较数组中两个相邻的元素,如果第一个数比第二个数大,就交换//2.每一次比较都会产出一个最大或者最小的元素//3.下一轮少一次排序//4.依次循环,直到结束!public static  void sort(int[] array){//外层循环,判断程序要走多少次int temp;//临时变量for (int i = 0; i < array.length - 1; i++) {//内层循环,比较两个数,如果第一个数比第二个数大,则交换for (int j = 0; j < array.length-1-i; j++) {if(array[j] > array[j+1]){temp = array[j];array[j] = array[j+1];array[j+1] = temp;}}}}}

二、选择排序

1、 什么是选择排序?
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

2、选择排序原理是什么?
如下图,该图是选择排序的效果动图
在这里插入图片描述
java代码实现

class demo2 {public static void main(String[] args) {int[] arr = {26, 1, 80, 27, 133};int temp = 0;// for循环嵌套实现for (int j=0;j<arr.length-1;j++){for (int i=1+j;i<arr.length;i++){if(arr[i]<arr[j]){temp=arr[j];arr[j]=arr[i];arr[i]=temp;}}}//实现遍历System.out.print("[");for (int x = 0; x < arr.length; x++) {if (x == arr.length - 1) {System.out.println(arr[x] + "]");} else {System.out.print(arr[x] + ",");}}}}
//结果
//[1,26,27,80,133]

三、快速排序

快速排序,顾名思义,是一种速度快,效率高的排序算法。
在这里插入图片描述
java代码实现

class demo3 {public static void main(String[] args){int[] arr = {4,1,2,3,5,14,23,12,7,14};quickSort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}public static void quickSort(int[] arr, int left, int right) {if(left >= right) {//终止条件,如果左边界下标等于有边界下标,或者大于右边界下标的时候,说明当前数组的长度已经是1乃至该数组物理上不存在了,因此就直接返回,终止递归,这里是递归出口。return ;}int i = left,j = right,base = arr[i];//根据传入的左右边界声明出两个游标,同时指定好基准数,我们命名为basewhile(i!=j) {//只要左右游标不相等,说明二者没有相遇,循环就会继续执行while(i<j && arr[j] >= base) {//j游标先行,只要j游标指向的数值大于基准数,j游标就开始游移,需要注意的是在j游标游移的过程中也会时刻注意到i和j游标是否相遇了,只要相遇就停止j--;//j游标是往前走}while(i<j && arr[i] <= base) {//i游标后走,只要是i游标指向的数值小于基准数,i游标就开始游移,需要注意的是i游标在游移的过程中也会时刻注意到i和j游标是否相遇了,只要相遇就停止i++;}int temp = arr[j];//在退出上边的外循环之后,说明二者均指向了需要被交换的元素,也就是说i指向了一个大于基准数的元素,j指向了一个小于基准数的元素,因此二者发生交换。如果此时两数不是因为这种指向情况而导致的交换,是由于相遇导致的交换,那么这个交换将没有意义arr[j] = arr[i];arr[i] = temp;}arr[left] = arr[i];//与基准数交换,此时我们已经找到了基准数的准确位置,我们将基准数与当前位置上的元素进行一次交换arr[i] = base;quickSort(arr, left, i-1);//递归的处理当前两个游标位置的右边无序数组quickSort(arr, i+1,right);//递归的处理当前两个游标位置的左边无序数组}}

四、其它排序

其它排序详情点击传送门

如果对你有帮助,可以点个小心心 你的鼓励是我创作的动力!

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

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

相关文章

RFC959 文件传输协议(FTP)翻译

发布时间&#xff1a;2023-07-12 21:14:54 前言 想做一下FTP的项目&#xff0c;带师说要参考RFC做才能标准化&#xff0c;先翻译一下。 官方文档&#xff1a;https://www.rfc-editor.org/rfc/inline-errata/rfc959.html 本备忘录的状态 本备忘录是文件传输协议&#xff08…

请求响应-数组集合参数的接受

数组集合参数 数组参数&#xff1a;请求参数名与形参数组名称相同且请求参数为多个&#xff0c;定义数组类型形参即可接受参数 具体关键代码如下&#xff1a; 在psotman中发出对应请求&#xff0c;结果如下&#xff1a; 集合参数&#xff1a;请求参数与形参集合名称相同且请求…

前端框架Layui实现动态树效果(书籍管理系统左侧下拉列表)

目录 一、前言 1.什么是树形菜单 2.树形菜单的使用场景 二、案例实现 1.需求分析 2.前期准备工作 ①导入依赖 ②工具类 BaseDao&#xff08;通用增删改查&#xff09; BuildTree(完成平级数据到父子级的转换) ResponseUtil&#xff08;将数据转换成json格式进行回显&…

vue el-table的每行操作el-button添加单独的loading效果实现

vue el-table的每行操作el-button添加单独的loading效果实现 效果图&#xff1a;实现代码&#xff1a;结语 效果图&#xff1a; 实现代码&#xff1a; <tamplate><el-table :data"list" ><el-table-column fixed"right" label"操作&q…

java方法的可变参数

Java方法的参数列表可以包含可变参数。可变参数其实就是相同类型的多个参数构成的数组。 可变参数是类型后面跟着省略号&#xff08;…&#xff09;&#xff0c;然后空格&#xff0c;然后跟可变参数的名称。当然&#xff0c;类型和省略号之间可以包含空格&#xff0c;但不建议这…

【Hello mysql】 mysql的约束

Mysql专栏&#xff1a;Mysql 本篇博客简介&#xff1a;介绍mysql的约束 mysql的约束 表的约束空属性默认值列描述zerofill主键自增长唯一键外键总结 表的约束 为什么要有约束&#xff1f; 我们在收集一些数据的时候会要求该数据必须存在 比如说像是国家在登记公民信息的时候身…

ESP32开发板引脚介绍【附有引脚使用实例】

ESP32开发板引脚介绍 文章目录 ESP32开发板引脚介绍&#x1f468;‍&#x1f3eb;内容1&#xff1a;背景&#x1f468;‍⚖️内容2&#xff1a;限制类引脚&#x1f468;‍&#x1f4bb;内容3&#xff1a;ESP32 周边设备&#x1f349;文末备注 &#x1f468;‍&#x1f3eb; &am…

webpack的打包流程

webpack的打包流程 yarn build 开始都走了哪些流程 yarn build 开始都走了哪些流程

ROS中bag的录制、播放和使用

文章目录 前言一、bag录制二、bag信息查看三、bag播放四、bag的使用&#xff08;以A-LOAM为例&#xff09; 前言 传感器获取到的信息&#xff0c;有时我们可能需要实时处理&#xff0c;有时可能只是采集数据&#xff0c;事后分析&#xff0c;比如: 机器人导航实现中&#xff0…

【雕爷学编程】Arduino动手做(138)---64位WS2812点阵屏模块5

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

openssl源码编译输出库-guidance-傻瓜式教程

目标&#xff1a; 下载openssl源码 编译输出目标版本&#xff0c;例如使用Android NDK编译输出Android使用的32位的库 1、下载源码 git clone https://github.com/openssl/openssl.git -b openssl-3.0.9 2、 请下载Linux版本的Android NDK 请下载Linux版本的Android NDK, 并完…

CUDA11.1、cuDNN8.6.0、Tensorrt8.5.3,ubuntu20.04安装过程记录

CUD11.1 下载地址&#xff1a;CUDA Toolkit Archive | NVIDIA Developer 安装&#xff1a; wget https://developer.download.nvidia.com/compute/cuda/11.1.1/local_installers/cuda_11.1.1_455.32.00_linux.run sudo sh cuda_11.1.1_455.32.00_linux.run 对于不是sudo用户&…