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实现的更多相关文章

  1. 常见排序算法JAVA实现

    1.冒泡排序,时间复杂度:最好:T(n) = O(n) ,情况:T(n) = O(n2) ,平均:T(n) = O(n2) public int[] bubbleSort(int[] nums) { ...

  2. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  3. 常见排序算法总结 -- java实现

    常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...

  4. 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)

    排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...

  5. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

  6. Java基础语法(8)-数组中的常见排序算法

    title: Java基础语法(8)-数组中的常见排序算法 blog: CSDN data: Java学习路线及视频 1.基本概念 排序: 是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合 ...

  7. 常见排序算法总结(java版)

    一.冒泡排序 1.原理:相邻元素两两比较,大的往后放.第一次完毕,最大值在最大索引处. 即使用相邻的两个元素一次比价,依次将最大的数放到最后. 2.代码: public static void bub ...

  8. 常见排序算法(java实现)

    常见排序算法介绍 冒泡排序 代码: public class BubbleSort { public static void sort(int[] array) { int tValue; for ( ...

  9. 八大排序算法Java实现

    本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...

随机推荐

  1. flume 前世今生

    Cloudera 开发的分布式日志收集系统 Flume,是 hadoop 周边组件之一.其可以实时的将分布在不同节点.机器上的日志收集到不同的存储系统.Flume 初始的发行版本目前被统称为 Flum ...

  2. shell 查看去掉windons中的换行符

    查看 cat -v 1.sh 替换 sed -i 's/\r//g' 1.sh

  3. Hiero中修改BinView中binitem对象名字的方法

    之前博客提到了scan for more version这样一个功能,该功能会放宽查询条件,这就会导致BinItem的名称与activeVersion的名称不符.这篇博客提供了一个方法去统一名称. 该 ...

  4. ALGO-145_蓝桥杯_算法训练_4-1打印下述图形

    记: 这里用到了printf("%*s%s%*s\n",n-i,"",arr,n-i,"");的写法, 其中%*s中的*代表该字符串s的个数 ...

  5. STL基础--基本介绍

    为什么要使用C++标准库 /* * 为什么使用C++标准库: * 1. 代码重用,不用重新造轮子 * 2. 效率(快速,且使用更少的资源). 现代C++编译器经常对C++标准库的代码有优化 * 3. ...

  6. Mina - 模拟同步请求

    这篇博客主要就铺代码吧,Mina的一些基础知识可以参考: http://www.cnblogs.com/huangfox/p/3458272.html 场景假设: 1.客户端发送用户信息,服务端根据用 ...

  7. Ubuntu 14.10 下Hadoop HttpFS 配置

    因为hadoop集群中需要配置一个图形化管理数据的截面,后来找到HUE,那么在配置HUE的过程中,发现需要配置httpfs,因为配置了httpfs,hue才能去操作hdfs中的数据. HttpFs能干 ...

  8. Windowsx64位安装pymssql并完成与数据库链接

    常流程只需要打开下载并按照常规方法安装mssql包即可在程序中import pymssql,不过安装mssql确实有些小麻烦. 从开始安装就开始出现了各种异常错误 首先出现sqlfront.h文件找不 ...

  9. Dubbo(2)发布Dubbo服务

    主要参考Dubbo源码包里面的dubbo-demo源码: 1.项目结构: 2.pom.xml中的依赖: <project xmlns="http://maven.apache.org/ ...

  10. 字符串分割split()

    知识讲解: split() 方法将字符串分割为字符串数组,并返回此数组. 语法: stringObject.split(separator,limit) 参数说明: 注意:如果把空字符串 (" ...