常用排序算法总结

概述

在计算器科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定排序方式进行排列的一种算法。本文将总结几类常用的排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序,分别使用Java代码实现,简要使用图例方式介绍其实现原理。


算法原理及实现

1、冒泡排序

  • 原理图

  • 理解

通过重复地遍历要排序的列表,比较每对相邻的项目,并在顺序错误的情况下交换它们。

  • Java Code
public class BubbleSort {// logic to sort the elementspublic static void bubble_srt(int array[]) {int n = array.length;int k;for (int m = n; m >= 0; m--) {for (int i = 0; i < n - 1; i++) {k = i + 1;if (array[i] > array[k]) {swapNumbers(i, k, array);}}printNumbers(array);}}private static void swapNumbers(int i, int j, int[] array) {int temp;temp = array[i];array[i] = array[j];array[j] = temp;}private static void printNumbers(int[] input) {for (int i = 0; i < input.length; i++) {System.out.print(input[i] + ", ");}System.out.println("\n");}public static void main(String[] args) {int[] input = { 4, 2, 9, 6, 23, 12, 34, 0, 1 };bubble_srt(input);}
}

2、选择排序

  • 原理图

  • 理解

内部循环查找下一个最小(或最大)值,外部循环将该值放入其适当的位置。

  • Java Code
public class SelectionSort {public static int[] doSelectionSort(int[] arr){for (int i = 0; i < arr.length - 1; i++){int index = i;for (int j = i + 1; j < arr.length; j++)if (arr[j] < arr[index]) index = j;int smallerNumber = arr[index];  arr[index] = arr[i];arr[i] = smallerNumber;}return arr;}public static void main(String a[]){int[] arr1 = {10,34,2,56,7,67,88,42};int[] arr2 = doSelectionSort(arr1);for(int i:arr2){System.out.print(i);System.out.print(", ");}}
}

冒泡排序和选择排序的区别

1、冒泡排序是比较相邻位置的两个数,而选择排序是按顺序比较,找最大值或者最小值;2、冒泡排序每一轮比较后,位置不对都需要换位置,选择排序每一轮比较都只需要换一次位置;3、冒泡排序是通过数去找位置,选择排序是给定位置去找数。

3、插入排序

  • 原理图

  • 理解

每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

  • Java Code
public class InsertionSort {public static void main(String a[]){int[] arr1 = {10,34,2,56,7,67,88,42};int[] arr2 = doInsertionSort(arr1);for(int i:arr2){System.out.print(i);System.out.print(", ");}}public static int[] doInsertionSort(int[] input){int temp;for (int i = 1; i < input.length; i++) {for(int j = i ; j > 0 ; j--){if(input[j] < input[j-1]){temp = input[j];input[j] = input[j-1];input[j-1] = temp;}}}return input;}
}

4、快速排序

  • 原理图

  • 理解

将原问题分解为若干个规模更小,但结构与原问题相似的子问题,递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

  • Java Code
public class QuickSort {private int array[];private int length;public void sort(int[] inputArr) {if (inputArr == null || inputArr.length == 0) {return;}this.array = inputArr;length = inputArr.length;quickSort(0, length - 1);}private void quickSort(int lowerIndex, int higherIndex) {int i = lowerIndex;int j = higherIndex;// calculate pivot number, I am taking pivot as middle index numberint pivot = array[lowerIndex+(higherIndex-lowerIndex)/2];// Divide into two arrayswhile (i <= j) {/*** In each iteration, we will identify a number from left side which * is greater then the pivot value, and also we will identify a number * from right side which is less then the pivot value. Once the search * is done, then we exchange both numbers.*/while (array[i] < pivot) {i++;}while (array[j] > pivot) {j--;}if (i <= j) {exchangeNumbers(i, j);//move index to next position on both sidesi++;j--;}}// call quickSort() method recursivelyif (lowerIndex < j)quickSort(lowerIndex, j);if (i < higherIndex)quickSort(i, higherIndex);}private void exchangeNumbers(int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}public static void main(String a[]){MyQuickSort sorter = new MyQuickSort();int[] input = {24,2,45,20,56,75,2,56,99,53,12};sorter.sort(input);for(int i:input){System.out.print(i);System.out.print(" ");}}
}

5、归并排序

  • 原理图

  • 理解

将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;得到若干个长度为2的有序数列,再将这些数列两两合并;得到若干个长度为4的有序数列,再将它们两两合并;直接合并成一个数列为止。

  • Java Code
public class MergeSort {private int[] array;private int[] tempMergArr;private int length;public static void main(String a[]){int[] inputArr = {45,23,11,89,77,98,4,28,65,43};MyMergeSort mms = new MyMergeSort();mms.sort(inputArr);for(int i:inputArr){System.out.print(i);System.out.print(" ");}}public void sort(int inputArr[]) {this.array = inputArr;this.length = inputArr.length;this.tempMergArr = new int[length];doMergeSort(0, length - 1);}private void doMergeSort(int lowerIndex, int higherIndex) {if (lowerIndex < higherIndex) {int middle = lowerIndex + (higherIndex - lowerIndex) / 2;// Below step sorts the left side of the arraydoMergeSort(lowerIndex, middle);// Below step sorts the right side of the arraydoMergeSort(middle + 1, higherIndex);// Now merge both sidesmergeParts(lowerIndex, middle, higherIndex);}}private void mergeParts(int lowerIndex, int middle, int higherIndex) {for (int i = lowerIndex; i <= higherIndex; i++) {tempMergArr[i] = array[i];}int i = lowerIndex;int j = middle + 1;int k = lowerIndex;while (i <= middle && j <= higherIndex) {if (tempMergArr[i] <= tempMergArr[j]) {array[k] = tempMergArr[i];i++;} else {array[k] = tempMergArr[j];j++;}k++;}while (i <= middle) {array[k] = tempMergArr[i];k++;i++;}}
}

常见排序算法复杂度


原文链接
本文为云栖社区原创内容,未经允许不得转载。

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

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

相关文章

4. java——多态(java巅峰设计,超越了C++的理解,取其精华,去其糟粕)

多态指的是同—个行为具有多个不同表现形式 。是指—个类实例(对象&#xff09;的相同方法在不同情形下具有 不同表现形式。封装和继承是多态的基础&#xff0c;也就是说&#xff0c;多态只是—种表现形式而已。一个对象&#xff0c;同一个方法不同形态&#xff0c;方法必须重…

ETL异构数据源Datax_日期增量同步_13

文章目录一、全量同步1. 增量同步SQL2. 构建reader3. 构建writer4. 字段对应关系映射5. 构建json6. 选择同步模板7. 查询最早时间8. 修改任务信息9. 添加增量参数10. 数据清理11. 执行任务12. 查看执行日期13. 数据验证15. 查看同步脚本二、基于日期增量同步2.1. 新增新数据2.2…

如何使用 SQL Server FILESTREAM 存储非结构化数据?这篇文章告诉你!

作者 | ALEN İBRI译者 | 火火酱&#xff0c;责编 | Carol封图 | CSDN 付费下载于视觉中国 在本文中&#xff0c;我将解释如何使用SQL Server FILESTREAM来存储非结构化数据。同时&#xff0c;还会介绍FILESTREAM的优缺点。 在SQL Server的早期版本中&#xff0c;非结构化数据的…

Apache Flink 进阶入门(二):Time 深度解析

前言 Flink 的 API 大体上可以划分为三个层次&#xff1a;处于最底层的 ProcessFunction、中间一层的 DataStream API 和最上层的 SQL/Table API&#xff0c;这三层中的每一层都非常依赖于时间属性。时间属性是流处理中最重要的一个方面&#xff0c;是流处理系统的基石之一&am…

月活用户达7.55亿,阿里淘系如何在后流量时代引爆用户增长?

2019 年 8 月&#xff0c;阿里巴巴集团公布截至 2019 年 6 月 30 日止季度业绩。 财报显示&#xff0c;本季度阿里巴巴集团收入为 1149.24 亿元人民币&#xff0c;同比增长 42%。其中&#xff0c;淘宝、天猫在内的中国零售平台移动月活跃用户达 7.55 亿&#xff0c;较上一季度…

数组,三种初始化和内存分析

数组&#xff0c;三种初始化和内存分析 Java内存分析&#xff1a; 堆&#xff1a;存放new的对象和数组 ​ 可以被所有的线程共享&#xff0c;不会存放别的对象引用 栈&#xff1a;存放基本变量类型&#xff08;会包含这个基本类型的具体数值&#xff09; ​ 引用对象的变量&a…

Arthas 3.1.2 版本发布 | 增加 logger/heapdump/vmoption 命令

最近偶尔有用户反馈某些 HTTP 接口出现超时问题&#xff0c;而 web 服务端的 Trace 监控没有出现 http 返回值为 503 等异常情况。出现这种情况一般是web容器出现问题&#xff0c;客户端连 Arthas是Alibaba开源的Java诊断工具&#xff0c;深受开发者喜爱。 Github&#xff1a;h…

Linux 便笺技巧专栏

文章目录一、 vi 专栏二、固定ip设置2.1. 自动获取改为静态2.2. IDADDR获取2.3. GATEWAY获取2.4. 重新网卡2.5. 重新连接三、主机名调整3.1. 临时有效主机名3.2. 永久有效主机名四、防火墙调整4.1. 临时关闭防火墙4.2. 开机不启动防火墙五、shell脚本5.1. shell格式5.2. shell执…

刚刚,Python内幕被爆出!网友:请收下我的膝盖!

2020 年 5 月全国招收程序员 312761 人。2020 年 5 月全国程序员平均工资 14542 元&#xff0c;工资中位数 12500 元&#xff0c;其中 95% 的人的工资介于 5250 元到 35000 元。请问你拖后腿了吗&#xff1f;作为一名老码农&#xff0c;这次请收下我的膝盖&#xff01;事情起因…

阿里99大促 | 模型识别背后的样本生成

背景 在上一篇文章详解阿里99大促活动页内容识别技术实现&#xff0c;我们介绍了在淘宝99大促中&#xff0c;我们使用了怎样的算法模型去识别并完成自动化测试的。 迫切解决的样本问题 淘宝大促有近百个模块、上千个页面&#xff0c;模块间具有相似性&#xff0c;并且模块内…

这6种编码方法,你掌握了几个?

阿里妹导读&#xff1a;Don Roberts 提出的一条重构准则&#xff1a;第一次做某件事时只管去做&#xff1b;第二次做类似的事时会产生反感&#xff0c;但无论如何还是可以去做&#xff1b;第三次再做类似的事时&#xff0c;你就应该重构。 编码也是如此&#xff0c;当多次编写…

扎根中国20年,F5“代码到用户”线上峰会盛大启幕

2020年5月20日&#xff0c;全球领先的多云应用服务厂商F5公司以线上峰会的形式开启了F5 2020 “代码到用户” 暨F5中国20周年纪念庆典&#xff0c;深入解读了F5“代码到用户” 的战略。F5全球首席执行官范仲林先生、F5全球首席科学家及首席技术官林耕先生、NGINX创始人Igor Sys…

Hadoop集群安装部署_伪分布式集群安装_01

文章目录一、配置基础环境1. 设置静态ip2. hostname3. firewalld4. ssh免密码登录5. JDK一、配置基础环境 1. 设置静态ip [rootbigdata01 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33BOOTPROTO"static" IPADDR192.168.92.100 GATEWAY192.168.92.2 DNS1192.…

Hadoop集群安装部署_伪分布式集群安装_02

文章目录一、解压安装1. 安装包上传2. 解压hadoop安装包二、修改Hadoop相关配置文件2.1. hadoop-env.sh2.2. core-site.xml2.3. hdfs-site.xml2.4. mapred-site.xml2.5. yarn-site.xml2.6. workers三、格式化与启动集群3.1. 格式化HDFS3.2. 启动伪分布集群3.3. 异常解决方案3.4…

在 520 这天,竟然有人把 Docker讲清楚了? | 原力计划

作者 | 夏目 "责编 | 王晓曼头图 | CSDN下载自东方IC出品 | CSDN博客简介1、了解Docker的前生LXCLXC为Linux Container的简写。可以提供轻量级的虚拟化&#xff0c;以便隔离进程和资源&#xff0c;而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C中的NameSp…

为什么它有典型FaaS能力,却是非典型FaaS架构?

阿里妹导读&#xff1a;FaaS—Function as a service&#xff0c;函数即服务。它是2014年由于亚马逊的AWS Lambda的兴起&#xff0c;而被大家广泛认知。FaaS能力是NBF中的一项非常重要的能力&#xff0c;NBF是一个非典型的FaaS架构&#xff0c;但是具备了典型的FaaS能力。文章将…

如何解决90%的问题?10位阿里大牛公布方法

世界在变&#xff0c;技术在变&#xff0c;需求在变。 唯一不变的是变化。 面对变化&#xff0c;技术人如何在不确定性的世界中寻找最优解&#xff1f; 查理芒格说&#xff1a;“掌握一定数量的思维模型&#xff0c;能解决这世上90%的问题。”与其在重复的“增、删、改、查”…

Hadoop集群安装部署_分布式集群安装_01

文章目录1. 分布式集群规划2. 数据清理3. 基础环境准备4. 配置ip映射5. 时间同步6. SSH免密码登录完善7. 免密登录验证1. 分布式集群规划 伪分布集群搞定了以后我们来看一下真正的分布式集群是什么样的 看一下这张图&#xff0c;图里面表示是三个节点&#xff0c;左边这一个是…

今天,Python信息量很大!

小白程序员Python自学之痛&#xff1a;第一周找学习资源&#xff0c;第二周入门到放弃&#xff0c;第三周怀疑自己。明明10元钱就能搞定的事情&#xff0c;为什么要反反复复折磨自己呢&#xff1f;为了让用户用更优惠的价格买到优质的课程&#xff0c;CSDN和老师反复争取&#…