排序算法Java实现
本文会通过Java语言实现:冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序,希尔排序
1 分析排序算法
1.1 执行效率
- 最好的情况,最坏的情况,平均情况时间复杂度
- 时间复杂度的系数,常数,低阶
- 比较次数和交换次数
1.2 算法的内存消耗
算法的内存消耗我们可以通过空间复杂度来度量。
原地排序算法,就是特指空间复杂度是O(1)的排序算法。
1.3 排序算法的稳定性
如果序列中有值相等的元素, 经过排序之后,相等元素之间原有的先后顺序不变化。
2 冒泡排序
稳定排序算法,原地排序算法,时间复杂度:O(n^2)
冒泡排序操作相邻的两个数据,每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系。每次冒泡都能选出最大的或者最小的值。
/**
* 冒泡排序
* @param arr
* @return
*/
public static int[] bubbleSort(int[] arr) {
if (arr == null || arr.length == 0) {
return null;
}
int n = arr.length;
// 总共需要循环n次 每次通过冒泡 得到最大的
for (int i = 0; i < n; i++) {
// 因为上一次已经确定了最大的,所以需要遍历的数据就是(n-1)-i
boolean flag = true;
for (int j = 0; j < (n - 1) - i ; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = false;
}
}
// 因为冒泡 如果这次冒泡没有数据没有交换所以数据已经有序了,可以提前退出
if (flag) {
break;
}
}
return arr;
}
3 插入排序
稳定排序算法,原地排序算法,时间复杂度O(n^2)
根据,把位置的元素,插入在有序的集合中,插入的时候根据元素位置大小。
首先:讲数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素就是数组的第一个元素。
/**
* 插入排序
* @param arr
* @return
*/
public static int [] insertSort(int [] arr){
if (arr==null||arr.length==0) {
return null;
}
int n = arr.length;
// n从一1开始表示a[0]属于有序序列
for (int i = 1; i < n; i++) {
// 当前需要比较的数字
int value = arr[i];
// 需要比较的次数
int j = i-1;
// 查找插入的位置
for (; j>=0; j--) {
if (arr[j]>value) {
// 数据移动
arr[j+1] = arr[j];
}else {
// 插入排序前面是有序序列,所有不需要移动数据的时候,直接跳出比较下个数字
break;
}
}
// 插入数据
arr[j+1] = value;
}
return arr;
}
4 选择排序
不是稳定排序算法,原地排序算法,时间复杂度是O(n^2)
每次会从未排序区间中找到最小元素,将其放到已排序区间的末尾
/**
* 选择排序
* @param arr
* @return
*/
public static int [] selectionSort(int [] arr){
if (arr==null||arr.length==0) {
return null;
}
int n = arr.length;
int temp = 0;
int minKey = 0;
// 刚开始没有有序区间,所以从0开始
for (int i = 0; i < n; i++) {
minKey = i;
// 寻找无序区间最小的元素
for (int j = i+1; j < n; j++) {
if (arr[j]<arr[minKey]) {
minKey = j;
}
}
// 交换位置
temp = arr[i];
arr[i] = arr[minKey];
arr[minKey] = temp;
}
return arr;
}
未完,待续

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Java入门系列-26-JDBC
认识 JDBC JDBC (Java DataBase Connectivity) 是 Java 数据库连接技术的简称,用于连接常用数据库。 Sun 公司提供了 JDBC API ,供程序员调用接口和类,集成在 java.sql 和 javax.sql 包中。 Sun 公司还提供了 DriverManager 类用来管理各种不同的JDBC驱动。 不同数据库厂商提供各自的JDBC驱动,所以我们想要连接数据库除了要了解 JDBC API 还需要下载各数据库厂商的驱动 jar 包。 JDBC API JDBC API主要用于与数据库建立连接、执行SQL语句、处理结果,其中核心类和接口如下: DriverManager:依据数据库的不同,管理JDBC驱动 Connection:负责连接数据库并担任传送数据的任务 Statement:由 Connection 产生、负责执行SQL语句 ResultSet:负责保存 Statement 执行后所产生的查询结果 JDBC 编码模板 1、与数据库建立连接并获取连接 Connection connection=DriverManager.getConne...
-
下一篇
源码安装MySQL步骤
一、源码编译的优缺点: 1.1 源码编译虽然繁琐复杂,但是有最好的平台适应性。 1.2 能体现出最好的性能(根据系统状态来产出何时的目的代码) 1.3 支持特殊的字符集 1.4 可以定制存储引擎 1.5 编译的过程,也是熟悉MySQL的过程。 二、源码包下载(官网 www.mysql.com) DOWNLOADS——Archives(归档目录)——MySQL Community Server 下载选项: Product Version 产品版本 → 选择版本(例如:8.0.12) Operating System 操作系统 → 选择Source Code(源代码) OS Version 系统版本→ 选择Generic Linux (Architecture Independent) 通用Linux(架构独立) 下载 Compressed TAR Archive,Includes Boost Headers→选择带有Boost头的压缩包(MySQL需要Boost C++库构建) 三、查看下载文件并解压缩 [root@JSH-01 ~]# cd /usr/local/...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Redis,开启缓存,提高访问速度
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7,8上快速安装Gitea,搭建Git服务器