常见排序算法 - 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实现
本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...
随机推荐
- Flume 多个agent串联
多个agent串联 采集需求:比如业务系统使用log4j生成的日志,日志内容不断增加,需要把追加到日志文件中的数据实时采集到hdfs,使用agent串联 根据需求,首先定义以下3大要素 第一台flum ...
- [转]TA-Lib 安装
转自:https://mrjbq7.github.io/ta-lib/install.html Installation You can install from PyPI: $ pip instal ...
- java面试题001
1.指针和函数的关系 这里主要谈指针函数和函数指针,在c中指针函数是返回值为指针的函数:函数指针是指向函数的指针变量. 2.什么是事务? 为了完成对数据的操作,要求并发访问在多个构件之间共享的数据.这 ...
- Video Processing subsystem例程分析
Video Processing subsystem例程分析 1.memory_ss模块 slave端口: S00: 连接设备: microblaze_ss----M_AXI_DC 时钟来源: S01 ...
- MySQL测试报告
硬件配置: 3台服务器:192.168.23.168, 192.168.23.169, 192.168.23.170 硬盘:230G 内存:16G Linux内核:Linux geoserver. ...
- Django REST framework 源码剖析
前言 Django REST framework is a powerful and flexible toolkit for building Web APIs. 本文由浅入深的引入Django R ...
- 安装Microsoft SQL server Management Studio Express 2005 错误码是29506解决方案
安装Microsoft SQL server Management Studio Express 2005,安装程序在安装此软件包时遇到一个错误,这可能表示此软件包有错.错误码是29506”权限问题. ...
- google使用的开源的工具类Thumbnailator图像处理
maven依赖 <dependency> <groupId>net.coobird</groupId> <artifactId>thum ...
- html json 导出Excel
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 卡尔曼滤波器实例:跟踪自由落体运动:设计与Matlab实现
[首发:cnblogs 作者:byeyear Email:byeyear@hotmail.com] 本文所用实例来自于以下书籍: Fundamentals of Kalman Filter ...