常见排序算法 - Java实现
1.冒泡排序
每次比较相邻的两个元素大小,调整顺序。从头到尾执行一轮(i),最大数值的元素就排到最后。每次从头到尾执行一轮,都会排好一个元素(length - i - 1)。这就是说一个包含 n 个元素的数组,最大需要 n - 1 次就可以完成数组排序。代码如下:
public static void bubbleSort(int[] array) {
int length = array.length;
for (int i = 0; i < length - 1; i++) {
for (int j = 0; j < length - i - 1; j++) {
if (array[j] > array[j + 1]) {
array[j] ^= array[j + 1];
array[j + 1] ^= array[j];
array[j] ^= array[j + 1];
}
} System.out.print("排序次数 - " + (i+1) + "次:");
printArray(array);
}
}
测试的方法要是选择极端情况(已经排好序,只不过是个相反的)。那么就结结实实执行 n-1 轮比较。但是往往不是每次都如此极端,排序时就会有几轮是空转的。这时可以使用一个开关对上边的冒泡排序进行优化。
// BubbleSort 冒泡排序, 优化一下
public static void bubbleSortOpt(int[] array) {
int length = array.length;
for (int i = 0; i < length - 1; i++) {
int exitFlag = 0; // 增加一个退出开关
for (int j = 0; j < length - i - 1; j++) {
if (array[j] > array[j + 1]) {
array[j] ^= array[j + 1];
array[j + 1] ^= array[j];
array[j] ^= array[j + 1]; exitFlag++; // 排序完成时,不会触动这个开关
}
}
if (0 == exitFlag) { // 开关没有动的时候,排序结束
break;
} System.out.print("排序次数 - " + (i + 1) + "次:");
printArray(array);
}
}
2.选择排序
遍历数组,找出最小的元素,与首个元素交换位置。再次遍历未排序的数组元素,与首个未排序的元素交换位置。需要找出 n-1 次最小值,就可以完成排序。
算法实现时,借助两个算法,一个找出数组的最大值,一个获取数组元素的下标。
// k值为true,返回数组 最大值; 反之为false,返回数组 最小值
public static int getMaxMinValue(int[] array, int start, boolean k) {
int keyValue = array[start];
for (int i = start + 1; i < array.length; i++) {
if (keyValue > array[i] ^ k) {
keyValue = array[i];
}
} return keyValue;
} // 获取指定元素的下标
public static int getIndexOfArray(int[] array, int num) {
for (int i = 0; i < array.length; i++) {
if (array[i] == num) {
return i;
}
}
return -1;
}
选择排序方法:
// SelectSort 选择排序
public static void SelectSort(int[] array) {
int length = array.length;
int minValue;
int minIndex; for (int i = 0; i < length - 1; i++) {
minValue = getMaxMinValue(array, i, false);
minIndex = getIndexOfArray(array, minValue);
if (minIndex != i) {
// 交换位置
array[i] ^= array[minIndex];
array[minIndex] ^= array[i];
array[i] ^= array[minIndex];
} System.out.print("排序次数 - " + (i + 1) + "次:");
printArray(array);
}
}
要是需要排序的数组,刚好是逆序的。这个时候,经过 (int) (n/2) 轮比较,就已经完成整个数组的排序了,后续全都是空转。同样可以增加开关优化代码执行。
// SelectSort 选择排序,优化一下啊
public static void SelectSortOpt(int[] array) {
int length = array.length;
int minValue;
int minIndex; for (int i = 0; i < length - 1; i++) {
minValue = getMaxMinValue(array, i, false);
minIndex = getIndexOfArray(array, minValue);
int exitFlag = 0; // 增加一个退出开关
if (minIndex != i) {
// 交换位置
array[i] ^= array[minIndex];
array[minIndex] ^= array[i];
array[i] ^= array[minIndex]; exitFlag++; // 排序完成时,不会触动这个开关
}
if (0 == exitFlag) { // 开关没有动的时候,排序结束
break;
} System.out.print("排序次数 - " + (i + 1) + "次:");
printArray(array);
}
}
3.插入排序
3.1.直接插入排序
把需要排序的数组元素,依次插入已排序的数组中,返回这个有序数组就是排序好的效果。
// directInsertionSort 直接插入排序
public static void directInsertionSort(int[] array) {
int length = array.length;
int count=0;
for (int i = 1; i < length; i++) { // 未排序数组
for (int j = 0; j < i; j++) { // 已排序数组
if (array[i] < array[j]) {
// 这里可不是互换,而是依次移动数组元素。内层for循环轮询了一遍有序数组。
// 极端情况下,每个已排序元素都要移动一次
array[i] ^= array[j];
array[j] ^= array[i];
array[i] ^= array[j];
count++;
}
} System.out.print("排序次数 - " + count + "次:");
printArray(array);
}
}
代码看着不多,觉得运算量太大了。
3.2.希尔排序
在直接插入排序的基础上完成希尔排序。
选取关键字,把数组分组,组内使用直接插入排序。直到关键字为1。
4.归并排序
5.快速排序
使用递归思想,把数组分成两份。每份单独排序
常见排序算法 - Java实现的更多相关文章
- 常见排序算法JAVA实现
1.冒泡排序,时间复杂度:最好:T(n) = O(n) ,情况:T(n) = O(n2) ,平均:T(n) = O(n2) public int[] bubbleSort(int[] nums) { ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 常见排序算法总结 -- java实现
常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...
- 常见排序算法题(java版)
常见排序算法题(java版) //插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.Sor ...
- Java基础语法(8)-数组中的常见排序算法
title: Java基础语法(8)-数组中的常见排序算法 blog: CSDN data: Java学习路线及视频 1.基本概念 排序: 是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合 ...
- 常见排序算法总结(java版)
一.冒泡排序 1.原理:相邻元素两两比较,大的往后放.第一次完毕,最大值在最大索引处. 即使用相邻的两个元素一次比价,依次将最大的数放到最后. 2.代码: public static void bub ...
- 常见排序算法(java实现)
常见排序算法介绍 冒泡排序 代码: public class BubbleSort { public static void sort(int[] array) { int tValue; for ( ...
- 八大排序算法Java实现
本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...
随机推荐
- sql update操作结果
Mysql 在MySQL中只有真正对记录进行修改了的情况下,row_count才会去记录影响的行数,否则如果记录存在但是没有实际修改则不会将该次更新记录到row_count中. update操作执行结 ...
- java程序控制
一.软件生命周期 什么是软件: 软件是程序员根据需求用计算机的语言去编写一系列的指令的集合,能让计算机快速去自动执行.1.1做市场调研----->调研报告书 ======项目经理 1.2可行性分 ...
- hanlp和jieba等六大中文分工具的测试对比
本篇文章测试的哈工大LTP.中科院计算所NLPIR.清华大学THULAC和jieba.FoolNLTK.HanLP这六大中文分词工具是由 水...琥珀 完成的.相关测试的文章之前也看到过一些,但本篇 ...
- Spring Cloud(Dalston.SR5)--Hystrix 监控
在服务调用者加入 Actuator ,可以对服务调用者的健康情况进行实时监控,例如,断路器是否打开.当前负载情况等. 服务调用者 需要增加 actuator依赖, 修改 POM.xml 中增加以下依赖 ...
- Aasible中cryptography兼容性报错解决办法
Aasible中cryptography兼容性报错解决办法 1 Ansible中使用ansible --version查看版本,报错信息如下: ERROR! Unexpected Exception, ...
- 移动互联网终端的touch事件判断方向
var pressX = 0, pressY = 0; document.body.addEventListener('touchmove', function(event) { // 如果这个元素的 ...
- 黄聪:微信小程序(应用号)资源汇总整理(转)
微信小应用资源汇总整理 开源项目 WeApp - 微信小程序版的微信 wechat-weapp-redux-todos - 微信小程序集成Redux实现的Todo list wechat-weapp- ...
- 客户端负载均衡Feign之一:申明式服务调用Feign入门示例
Spring Cloud提供了Ribbon和Feign作为客户端的负载均衡. 前面使用了Ribbon做客户端负载均衡,使用Hystrix做容错保护,这两者被作为基础工具类框架被广泛地应用在各个微服务的 ...
- Java-Runoob-高级教程-实例-数组:12. Java 实例 – 数组差集
ylbtech-Java-Runoob-高级教程-实例-数组:12. Java 实例 – 数组差集 1.返回顶部 1. Java 实例 - 数组差集 Java 实例 以下实例演示了如何使用 remo ...
- 学习笔记之人工智能(Artificial Intelligence)
人工智能 - 维基百科,自由的百科全书 https://zh.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD 人工智能(英语:Artif ...