排序算法及实现(上)

稳定性的判断:如果两个相同大小的元素也进行了交换就是不稳定,否则稳定
1.直接插入排序:

当插入第 i 位置元素时,前面 0 到 i-1 位置的元素已经各自有序。

此时将i 再次从i-1到0位置依次进行比较。找到合适位置将其插入,原本位置上的元素后移。

插入排序性质:

1.元素越接近有序,其效率越高。

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

3.空间复杂度:O(1)   //不占用额外的空间

4.稳定性:稳定          //一般判断是否稳定的标准是 遇到相同的元素是否交换,不交换则稳定

代码实现:

public static void insertSort(int[]array){//i从第二个位置开始遍历for(int i=1;i<array.length;i++){//每次外层循环都将i的值记录下来int temp = array[i];int j = i-1;//j从i的后一个元素开始,依次向后遍历for(;j>=0;j--){if(array[j] > temp){array[j+1] = array[j];}else{如果j的值小于或等于i直接跳出,继续i遍历break;}}array[j+1] = temp;}
}

2.希尔排序(缩小增量版排序)

思想:先选定一个整数,把待排序的数据按照这个整数的大小进行分组

再依次对各个组内的数据进行排序。这个整数不断减小,直到为1时,将所有数据

放在同一组排序。

下图为每次分组排序的过程。当gap=1 时排序完成,依次交换画下线的元素

总结:

1.希尔排序是对插入排序的优化,

2.当gap = 1之前,都是对数组的预排序目的是让数组更加接近有序,

        对整体而言当gap = 1时可以很好的排序,达到优化效果

3.希尔的时间复杂度不容易计算,因为gap的取值有很多。

        大多数的书给出的希尔排序的时间复杂度都不同,一般按照O(n^1.25)到O(6*n^1.25)计算

4.稳定性:不稳定

代码实现:

        

 /*** 希尔排序(分组后 用到插入排序)* 稳定性:不稳定* 时间复杂度:logN* @param arry*/public static void shellSort(int[] arry){//分组 gapint gap = arry.length;while(gap > 1){gap =gap/3+1;shell(arry,gap);}}/*** 每组进行插入排序* @param array* @param gap*/private static void shell(int[] array,int gap){for (int i = gap; i < array.length; i++) {int temp = array[i];int j = i-gap;for(;j>=0;j-=gap){if(array[j] > temp){//将小的赋值给大的array[j+gap] = array[j];}else {break;}}//不小就自己给自己赋值array[j+gap] = temp;}}

3.选择排序

思想:每次从排序的元素中选择最小或者最大的,放在序列的起始位置,直到要排序的元素全部拍完。

缺陷:效率不高,实际很少使用

时间复杂度:O(N^2),最坏情况每个元素两两之间都要比较

空间复杂度:O(1)

稳定性:不稳定

代码如下:

     */public static void swap(int[]array,int i,int j){int temp = array[j];array[j]  = array[i];array[i] = temp;}public static void selectSort(int[]array){for(int i=0;i< array.length;i++){int mindex = i;//从第二个位置开始寻找最下值的线标for(int j=i+1;j< array.length;j++){if(array[j]<array[mindex]){mindex = j;}}//找到的最小值下标与当前位置交换swap(array,mindex,i);}}
}

代码二:


4.堆排序(以大根堆为例)

排升序建立大根堆,排降序建立小根堆

时间复杂度:O(n*logn)  每一次的排序为logn,进行n次排序

空间复杂度:O(1)  //不占用额外的空间

稳定性:不稳定

 /*** 升序建立大根堆*/public static void headSort(int[]array){bigHead(array);int end = array.length-1;while (end>=0){swap(array,0,end);shiftDown(array, end,0 );end--;}}/*** 建立大根堆* @param arr*/public static void bigHead(int[]arr){for (int parent = (arr.length-1-1)/2; parent >=0 ; parent--) {shiftDown(arr,arr.length-1,parent);}}/***向下排序* @param array* @param end* @param parent*/public static void shiftDown(int[]array,int end,int parent){//左子树int child = 2*parent+1;while (child < end){//先判断右节点是否存在if(child+1 <end && array[child+1] >array[child]){child +=1;}if(array[child] > array[parent]){swap(array,child,parent);parent = child;child = 2*parent+1;}else {break;}}}/*** 用来交换数据的函数* @param array* @param i* @param j*/public static void swap(int[]array,int i,int j){int temp = array[j];array[j]  = array[i];array[i] = temp;}

5.冒泡排序

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

空间复杂度:O(1)

稳定性:稳定

代码实现:

public static void bubbleSort(int[]array){for (int i = 0; i < array.length-1; i++) {//定义flag进行优化,如果一趟下来都没有交换元素,则已经有序//直接break跳出,进行下一趟的比较boolean flag = false;for (int j = 1; j <array.length-i-1 ; j++) {if(array[j] > array[j+1]){swap(array,j,j+1);flag = true;}}//在优化的情况下如果数据 1 2 3 4 5//时间复杂度为:O(N)if(flag == false){break;}}}

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

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

相关文章

【Python】PYQT5详细介绍

本专栏内容为&#xff1a;Python学习专栏 通过本专栏的深入学习&#xff0c;你可以了解并掌握Python。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;Python &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f3…

GitHub操作

远程库-GitHub GitHub网址 GitHub是全球最大的远程库 1. 创建远程库 2. 远程仓库操作 2.1 创建远程仓库别名 git remote -v 查看当前所有远程库地址别名 git remote add 别名 远程地址 设置远程库地址别名 案例操作 起一个别名会出现两个别名&#xff0c;是因为既可以拉取…

macOS DOSBox 汇编环境搭建

正文 一、安装DOSBox 首先前往DOSBox的官网下载并安装最新版本的DOSBox。 二、下载必备的工具包 在用户目录下新建一个文件夹&#xff0c;比如 dosbox: mkdir dosbox然后下载一些常用的工具。下载好了后&#xff0c;将这些工具解压&#xff0c;重新放在 dosbox 这个文件夹…

数据链路层(详细版)【02】

接 数据链路层&#xff08;详细版&#xff09;【01】 文章目录 四、以太网MAC层&#xff08;一&#xff09;MAC地址组成&#xff08;1&#xff09;48位MAC地址格式&#xff08;2&#xff09;单播地址 & 多播地址 & 广播地址&#xff08;3&#xff09;全球管理 & 本…

笔记2:cifar10数据集获取及pytorch批量处理

&#xff08;1&#xff09;cifar10数据集预处理 CIFAR-10是一个广泛使用的图像数据集&#xff0c;它由10个类别的共60000张32x32彩色图像组成&#xff0c;每个类别有6000张图像。 CIFAR-10官网 以下为CIFAR-10数据集data_batch_*表示训练集数据&#xff0c;test_batch表示测试…

Colibri for Mac v2.2.0 原生无损音频播放器 激活版

Colibri支持所有流行的无损和有损音频格式的完美清晰的比特完美播放&#xff0c;仅使用微小的计算能力&#xff0c;并提供干净和直观的用户体验。 Colibri在播放音乐时使用极少的计算能力。该应用程序使用最先进的Swift 3编程语言构建&#xff0c;BASS音频引擎作为机器代码捆绑…

46 udp网络程序

查询网络服务的命令 netstat -nlup n: 显示数字 a&#xff1a;显示所有 u&#xff1a;udp服务 p&#xff1a;显示pid Recv-Q收到的数量&#xff0c;本地ip和远端ip&#xff0c;00表示可以收到任何地址 网络聊天 服务端 定义一个server类&#xff0c;成员保存ip地址&#xff…

JVM 类加载机制

JVM 类加载机制分为五个部分&#xff1a;加载&#xff0c;验证&#xff0c;准备&#xff0c;解析&#xff0c;初始化&#xff0c;下面我们就分别来看一下这五个过程。 加载 加载是类加载过程中的一个阶段&#xff0c;这个阶段会在内存中生成一个代表这个类的 java.lang.class 对…

基于yolov5+streamlit目标检测演示系统设计

YOLOv5与Streamlit&#xff1a;智能目标检测可视化展示介绍 随着人工智能技术的飞速发展&#xff0c;目标检测技术已成为推动智能化社会进步的关键技术之一。在众多目标检测算法中&#xff0c;YOLOv5以其卓越的性能和实时性&#xff0c;成为了业界的佼佼者。与此同时&#xff…

UDP多播

1 、多播的概念 多播&#xff0c;也被称为组播&#xff0c;是一种网络通信模式&#xff0c;其中数据的传输和接收仅在同一组内进行。多播具有以下特点&#xff1a; 多播地址标识一组接口&#xff1a;多播使用特定的多播地址&#xff0c;该地址标识一组接收数据的接口。发送到多…

实现红黑树

目录 红黑树的概念 红黑树的节点结构定义 红黑树的插入 红黑树的验证 实现红黑树完整代码 红黑树的概念 红黑树 &#xff0c;是一种 二叉搜索树 &#xff0c;但 在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是 Red 或 Black 。 通过对 任何一条从根到叶子的…

Leetcode39.组合总和

文章目录 题目描述解题思路重复子集剪枝 代码 题目 参考题解 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返…

【JavaSE】/*初识Java*/

目录 一、了解 Java 语言 二、Java 语言的重要性 2.1 使用程度 2.2 工作领域 三、Java 语言的特性 四、Java 的基础语法 五、可能遇到的错误 六、第一个 java 程序代码解析 七、Java 注释 八、Java 标识符 九、Java 关键字 一、了解 Java 语言 Java 是由 Sun Micr…

图论(洛谷刷题)

目录 前言&#xff1a; 题单&#xff1a; P3386 【模板】二分图最大匹配 P1525 [NOIP2010 提高组] 关押罪犯 P3385 【模板】负环 P3371 【模板】单源最短路径&#xff08;弱化版&#xff09; SPFA写法 Dij写法&#xff1a; P3385 【模板】负环 P5960 【模板】差分约束…

【iOS开发】—— 初识锁

【iOS开发】—— 初识锁 线程安全锁的种类自旋锁定义原理自旋锁缺点OSSpinLock&#xff08;自旋锁&#xff09; 互斥锁os_unfair_lockpthread_mutexNSLockNSRecusiveLockSemaphore信号量synchronized 总结两种之间的区别和联系&#xff1a; 线程安全 当一个线程访问数据的时候…

双向冒泡法,可以只求最大最小值

int BiBubbleSort(int Arr[],int n,int maxnum){int left0,rightn-1;int i;bool notDone true;int temp;if(n<2)return -1;while(left<right&&notDone){ notDone false; //设置未发生交换标志 for(ileft;i<right;i){if(Arr[i]>Arr[i1]){//swap(Arr[…

Python-VBA函数之旅-staticmethod函数

目录 一、staticmethod函数的常见应用场景 二、staticmethod函数使用注意事项 三、如何用好staticmethod函数&#xff1f; 1、staticmethod函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://blog…

HackMyVM-VivifyTech

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 wpscan feroxbuster hydra 提权 系统信息收集 横向渗透 git提权 get root 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 08:00:27:9d:6d:7b, …

【密评】 | 商用密码应用安全性评估从业人员考核题库(9/58)

Hill密码是重要古典密码之一&#xff0c;其加密的核心思想的是&#xff08;&#xff09;。 A.线性变换 B.非线性变换 C.循环移位 D.移位 著名的Kerckhoff原则是指&#xff08;&#xff09;。 A.系统的保密性不但依赖于对加密体制或算法的保密&#xff0c;而且依赖于密钥 B.系统…