常见简单的排序算法汇总

news2024/12/23 22:07:02

作者~小明学编程 

文章专栏Java数据结构

格言目之所及皆为回忆,心之所想皆为过往

目录

插入排序

原理

代码实现

算法性能分析

希尔排序

引入

原理

代码

算法分析

选择排序

原理

代码

堆排序

原理

代码

算法分析

冒泡排序

原理

代码

算法分析


插入排序

原理

插入排序顾名思义就是通过一个个的插入来实现排序的,首先我们遍历数组,每遍历一个元素,将其值给temp,然后找当前元素的前面一个元素,当我们只有一个元素的时候肯定就是有序的,所以我们一般就从第二个元素开始遍历。我们把i记作当前元素的下标,然后将j=i-1记作其前一个元素的下标。

 这里我们拿从小到大的顺序来做演示,所以当前我们j元素的下标的12,temp为8,当我们的j下标的元素大于temp的时候就将我们的当前元素向后推,也就是 array[j+1] = array[j],

 然后此时我们的j = -1,当j = -1的时候我们退出循环,然后将j+1的位置置为temp也就是8。

 这个时候我们的前两个元素就有序了,然后我们接着进行循环遍历2下标的位置。

依旧如上,因为j所在的位置大于我们的temp,所以将当前的元素向后推,当小于的时候就array[j+1] = temp。

 此时我们的前三个元素已经有序了,然后继续排序,

 array[j]>temp,所以向后推,

 这时我们发现array[j]<temp了,所以直接退出循环,执行array[j+1] = temp。

 此时前面四个元素已经排序完成,最后一个元素同理进行排序。

 最终完成了我们的插入排序。

代码实现

    public static void insertSort(int[] array) {
        for (int i = 1; i < array.length; i++) {
            int temp = array[i];
            int j = i-1;
            for (; j >=0 ; j--) {
                if (array[j] > temp) {
                    array[j+1] = array[j];
                } else {
                    break;
                }
            }
            array[j+1] = temp;
        }
    }

    public static void main(String[] args) {
        int[] array = {12,56,58,23,6,99,56};
        insertSort(array);
        System.out.println(Arrays.toString(array));//[6, 12, 23, 56, 56, 58, 99]
    }

算法性能分析

 算法稳定性:稳定。

重点:根据上表我们可以得出一个结论,对于快速排序来说,当我们的数据越有序,我们排序的速度就越快。

希尔排序

引入

希尔排序是由插入排序引入而来的,前面我们在学习插入排序的时候我们知道其算法的时间复杂度是比较高的,当我们有10000数据的时候最坏情况下的实例化复杂度为100000000,可以看到这个计算量是非常大的,一万就如此当有十万或者一百万个数据的时候就不知道要排到啥时候了。

这个时候我们有一个想法,那就是我们先把这10000个数据分成100份,这样每份就只有100个数据了,当我们再次的去实例化这个复杂度的时候就为100 * 100 * 100 = 1000000,一百万,相比之前的一个亿要好很多了,故而就引出了我们的额希尔排序。

原理

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数gap,把待排序文件中所有记录分成个gap组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。

1. 希尔排序是对直接插入排序的优化。
2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
 

代码

这里代码的实现是根据其思想写的,但是gap的值我们具体的去找合适的素数,只是通过除2来找出gap的大小。

    public 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;
        }
    }
    public static void shellSort(int[] array) {
        int gap = array.length;
        while (gap>1) {
            shell(array,gap);
            gap /= 2;
        }
        shell(array,1);
    }

算法分析

 稳定性:不稳定。

选择排序

原理

其中心思想就是:每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元素排完。

其实就是我们先要遍历一下我们的数组,当前的下标记作i,然后我们的j = i+1,让我们的j遍历后面的元素,如果当前的元素小于我们j下标的元素(从小到大排序为例)就交换,所以一个内循环结束无序序列最前面的元素就是最小的了。

代码

    public static void selectSort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            boolean flag = true;
            int min = i;
            for (int j = i+1; j < array.length; j++) {
                if (array[j]<array[min]) {
                    min = j;
                    flag = false;
                }
            }
            int ret = array[min];
            array[min] = array[i];
            array[i] = ret;
            if (flag) break;
        }
    }

这里面我们堆代码进行了一些优化,首先就是我们定义了min,就是记录我们最小值的下标,在我们内循环结束后就交换最前面的无序序列和我们的最小值,再而我们定义了一个flag如果我们检测到后面全部都是有序的话,直接退出循环。

时间复杂度空间复杂度
O(n^2)O(1)
数据不敏感数据不敏感

稳定性:不稳定

堆排序

原理

基本原理也是选择排序,只是不在使用遍历的方式查找无序区间的最大的数,而是通过堆来选择无序区间的最大的数。
注意排升序要建大堆;排降序要建小堆。

代码

    //堆排序
    public static void heapSort(int[] array) {
        createHeap(array);
        int len = array.length-1;
        while (len>0) {
            swap(array,0,len);
            shiftDown(array,0,len);
            len--;
        }
    }
    //建堆
    public static void createHeap(int[] array) {
        for (int parents = (array.length-1-1)/2; parents >= 0; parents--) {
            shiftDown(array,parents,array.length);
        }
    }
    //向下调整
    public static void shiftDown(int[] array,int parents,int len) {
        int children = parents * 2 + 1;
        while (children < len) {
            if ((children+1)<len && array[children]<array[children+1]) {
                children++;
            }
            if (array[parents] < array[children]) {
                swap(array,children,parents);
                parents = children;
                children = parents * 2 + 1;
            } else {
                break;
            }
        }
    }

排序过程:Heap Sort Visualization (usfca.edu)

算法分析

时间复杂度空间复杂度
O(n * log(n))O(1)
数据不敏感数据不敏感

稳定性:不稳定。

冒泡排序

原理

在无序区间,通过相邻数的比较,将最大的数冒泡到无序区间的最后,持续这个过程,直到数组整体有序。

代码

    //冒泡排序
    public static void bubbleSort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            boolean flag = true;
            for (int j = 0; j < array.length - i - 1; j++) {
                if (array[j]>array[j+1]) {
                    swap(array,j,j+1);
                    flag = false;
                }
            }
            if (flag) break;
        }
    }

算法分析

 稳定性:稳定。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pythonUI自动化测试selenium安装使用

pythonUI自动化测试selenium安装使用一、selenium二、安装1. selenium其实虽然称之为工具&#xff0c;但是实际是python中一个库2.安装浏览器3.下载浏览器驱动三、元素定位1.常见的元素定位方式2.打开浏览器3.设置最大行4.设置隐式等待5.打开网页6.点击 登录 按钮7.设置等待8.用…

【javaEE】网络编程套接字

To u&me: 努力经营当下&#xff0c;直至未来明朗 文章目录前言一、网络编程&#xff08;没时间可以跳过&#xff09;一&#xff09;网络编程了解二&#xff09;相关基本概念二、Socket套接字三、数据报套接字通信&#xff08;UDP&#xff09;写一个最简单的UDP版本的客户端…

[附源码]java毕业设计科院垃圾分类系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

高级UI-Canvas(变换技巧,状态保存)

前言 在前面我们把Paint关于UI颜色样式的处理进行了学习&#xff0c; 其实真正高级部分就是三个点&#xff0c;渲染&#xff0c;滤镜&#xff0c;图形组合&#xff0c;而我们图形绘制比较重要的另一个对象Canvas也是需要我们去重点掌握的&#xff0c;那么这次课咱们来进行Canv…

数组与指针实验

指针与数组实验 先简单看一下以下c代码 #include <stdio.h> #include <stdlib.h> int main() {char array[10];array[0] 0x56;array[1] 0x78;array[9] 0x12;char *p (char *)malloc(10);p[0] 0x34;p[1] 0x12;printf("%p\n%p\n%p\n%p\n", array, …

[附源码]Python计算机毕业设计 家乡旅游文化推广网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【微信小程序】.js文件的代码结构与Page页面的生命周期

&#x1f3c6;今日学习目标&#xff1a;第十期——.js文件的代码结构与page页面的生命周期 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰预计时间&#xff1a;25分钟 &#x1f389;专栏系列&#xff1a;我的第一个微信小程序 文章目录…

尚医通 (二十二) --------- MongoDB 简介

目录一、NoSQL 简介二、什么是 MongoDB ?三、MongoDB 特点四、安装 MongoDB1. 数据库2. 文档3. 集合4. 适用场景五、MongoDB 概念解析一、NoSQL 简介 NoSQL (NoSQL Not Only SQL)&#xff0c;意即反 SQL 运动&#xff0c;指的是非关系型的数据库&#xff0c;是一项全新的数据…

使用SRM系统有哪些供应商管理优势?

SRM系统就是我们常说的供应商关系管理&#xff0c;它主要是用来改善与供应链上游供应商的关系&#xff0c;改善企业与供应商的关系的新型管理机制&#xff0c;使双方关系更加紧密&#xff0c;从而实现供应双赢。相信对SRM供应商关系管理系统有了解的朋友们并不陌生&#xff0c;…

[力扣] 剑指 Offer 第二天 - 复杂链表的复制

这里写目录标题题目来源题目描述示例示例 1示例 2示例 3示例 4题目解析算法 1代码实现执行结果复杂度分析算法 2代码实现执行结果复杂度分析总结耐心和持久胜过激烈和狂热。 题目来源 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode…

鲁棒局部均值分解 (RLMD)(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

如何在Ubuntu 22.04使用wine安装windows版本微信

继上篇《如何在 Ubuntu 22.04 上安装 最新版本Wine》成功安装wine。使用以下命令安装&#xff1a; $ sudo dpkg --add-architecture i386 && sudo wget -qO - https://dl.winehq.org/wine-builds/winehq.key | sudo apt-key add - && sudo apt-add-repository…

从零开始学前端:json对象,对象的序列化和反序列化 --- 今天你学习了吗?(JS:Day16)

从零开始学前端&#xff1a;程序猿小白也可以完全掌握&#xff01;—今天你学习了吗&#xff1f;&#xff08;JS&#xff09; 复习&#xff1a;从零开始学前端&#xff1a;购物车和鲜花价格排序 — 今天你学习了吗&#xff1f;&#xff08;JS&#xff1a;Day15&#xff09; 文…

JVM基础

JVM简介 JVM是java虚拟机简称&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际计算机上仿真模拟各种计算机功能来实现的。也正式因为有了它&#xff0c;java才具有了跨平台特性&#xff0c;”一次编译&#xff0c;到处运…

隐私计算行业应用情况和标准化现状

开放隐私计算 2022-11-16 19:17 发表于浙江 开放隐私计算 开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的…

如何利用快解析实现个人私有云

个人云盘曾火爆一时&#xff0c;原因有二&#xff0c;一是国内可选择的网盘越来越少&#xff0c;自建网盘无疑是一个不错的选项&#xff0c;毕竟网盘是数据存在别人那&#xff0c;始终让人心里不安&#xff0c;如同车辆一样&#xff0c;云盘就是公交车&#xff0c;私有云盘就是…

Matlab:在文本和值之间转换datetimeduration

Matlab&#xff1a;在文本和值之间转换datetimeduration将值转换为文本datetimeduration将数组转换为字符串数组指定输出文本的格式指定输出文本的区域设置将文本转换为值datetime解释输入文本的格式将文本转换为值duration解释输入文本的格式从文件中读取日期和时间此示例演示…

面试经常问的Linux进程到底是什么呢?1W字从0到1详解进程的所有细节!

目录 1.冯诺伊曼体系 2.操作系统 3.进程 4.进程的三种状态 4.1概念 4.2Linux中不同进程状态 5.进程的优先级 6.进程的几个其它概念 7.进程的切换 8.环境变量 8.1环境变量的概念 8.2常见的环境变量 8.3和环境变量相关的命令 8.4查看环境变量的方法 8.5通过代码获取环境变量的方式…

微信小程序 webview组件内嵌H5二维码识别

结果 支持公众号二维码支持小程序码支持个人名片支持群聊不支持页面二维码 做法 点击图片触发previewImage预览&#xff0c;长按识别 <script type"text/javascript" src"https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>wx.p…

IT部门不想每天忙“取数”,花了几百万买系统,还是这个办法有效

待过几年中小型传统企业的应该都有这个感知&#xff1a;虽然每个月都在采购新的软件系统&#xff0c;但整个公司的数字化仍旧一团糟&#xff0c;数字化转型是越搞越回去了。 这也很好解释。 传统企业业务部门繁多&#xff0c;在搞信息化阶段采购了很多业务系统&#xff0c;比…