常见排序算法 - 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实现
本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...
随机推荐
- itertools.groupby()/itertools.compress() 笔记
关于itertools.groupby() itertools.groupby()就是将相邻的并且相同的键值划分为同一组,相似功能可以看https://docs.python.org/3/librar ...
- 排序算法<No.5>【堆排序】
算法,是系统软件开发,甚至是搞软件的技术人士的核心竞争力,这一点,我坚信不疑.践行算法实践,已经有一段时间没有practise了,今天来一个相对麻烦点的,堆排序. 1. 什么是堆(Heap) 这里说的 ...
- .net webapi 收不到json 实体类参数,返回的json中带有k__BackingField
案例:实体类是从WCF项目中复制到webapi项目中,去掉了[DataContract],[DataMember],但[Serializable] 没去掉. 在ApiController 中,实体类输 ...
- centos su命令
有很多指令都只可以用 root 身份去执行,因此我们需要成为 root 用户.要这样做,我们可以使用 su 指令(更替用户).su 指令有下列格式: su - <user>或su < ...
- webGL之three.js入门3--材料篇
这几天在看李鹏程翻译的[美]Jos Dirksen的<Three.js开发指南>,看到第八章了,现在来总结一下threejs中材料的相关知识.顺带也看完了上海交大的张雯莉出的<thr ...
- 黄聪:在.NET中使用GeckoFX 29
GeckoFX is a .NET control, that works similarly to “System.Windows.Forms.WebBrowser” Control, while ...
- 黄聪:JQUERY的datatables插件,Date range filter时间段筛选功能
需配合moment插件实现:http://momentjs.com/ 演示:http://live.datatables.net/zuciyawi/1/edit HTML代码 <!DOCTYPE ...
- rsync同步目录
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X) -r, --recursive recurse into directories - ...
- 【JVM】Class结构之常量池
常量池 主要包括下面2类: 字面量(Literal):如int,double,String等: 符号引用(Symbolic Reference): 符号引用 类和接口的全限定名: 字段的名称和描述符: ...
- 使用R语言-操作data.frame
1 向一个data.frame指定列插入一列新数据 1.1 插入一列到指定位置 y<-1:4 data1 <-data.frame(x1=c(1,3,5,7), x2=c(2,4,6,8) ...