常见排序算法 - 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实现
本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...
随机推荐
- Java利用hanlp完成语句相似度分析的案例详解
分享一篇hanlp分词工具使用的小案例,即利用hanlp分词工具分析两个中文语句的相似度的案例.供大家一起学习参考! 在做考试系统需求时,后台题库系统提供录入题目的功能.在录入题目的时候,由于题目来源 ...
- Usbhub驱动编译
在3g 4g的usb驱动基础上,加入以下部分,就可以驱动hub了 kmod-usb-hid 3.3.8-1 kmod-usbip 3.3.8-1 kmod-usbip-client 3.3.8-1 k ...
- 超级账本Hyperledge的kafka共识算法里的Topic 与 Partition
Topic在逻辑上可以被认为是一个queue队列,每条消息都必须指定它的topic,可以简单理解为必须指明把这条消息放进哪个queue里.为 了使得Kafka的吞吐率可以水平扩展,物理上把topic分 ...
- 天朝屁民每天做T跟菜贩一样,进菜-卖菜,为伟大的菜贩精神点赞
天朝屁民每天做T跟菜贩一样,进菜-卖菜,为伟大的菜贩精神点赞
- SET NOCOUNT ON
每次我们在使用查询分析器调试SQL语句的时候,通常会看到一些信息,提醒我们当前有多少个行受到了影响,这是些什么信息?在我们调用的时候这些信息有用吗?是否可以关闭呢? 答案是这些信息在我们的客户端的应用 ...
- 运营站点-开放robots后,站内google搜索数量第二天10条左右,第5天搜录9920条,可喜可贺
开放robots后,站内google搜索数量第二天10条左右,第5天搜录9920条,可喜可贺 2014年4月29日 16:17:56 到目前为之已搜录14000多条,已有客户在网站注册,加入购物车
- 关于Tomcat配置虚拟路径保存、访问图片
在项目中往往需要上传一些图片文件之类,一般不建议直接保存在数据库内,往往是讲图片等资源保存在服务器的某个文件夹下,传统做法是上传到部署目录下,通过相对路径进行访问. 这样当我们系统需要进行升级,进行全 ...
- [Java]JGit用法总结
clone public static void gitClone(String remoteUrl, File repoDir) { try { Git git = Git.cloneReposit ...
- 使用mongo shell转换字符类型
MongoDB数据类型如下: 类型 对应数字 别名 说明 Double1 1 double String 2 string Object 3 object Array 4 array ...
- Hive的UDF是什么?
首先我们学习hadoop的时候,为了让我们不太会java语言但是对SQL很熟悉的工程师能够操作基本的mapreduce计算过程,Hive被设计出来了.Hive就好比是hadoop在执行MR(mapre ...