Java实现基本排序算法
稳定排序算法性能比较

冒泡排序代码:
/**
* 冒泡排序
*
* @param arr
* @return
*/
public int[] bubbleSort(int[] arr) {
int temp;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
直接插入排序代码:
/**
* 直接插入排序
*
* @param arr
* @return
*/
public int[] insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
if (arr[i] < arr[i - 1]) {
int temp = arr[i];
int j = i;
while (j > 0 && arr[j - 1] > temp) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = temp;
}
}
return arr;
}
基数排序代码:
/**
* 基数排序,又称桶排序
*
* @param arr
* @return
*/
public int[] radixSort(int[] arr, int d) {
int k = 0;
int n = 1;
int m = 1; // 控制键值排序依据在哪一位
int[][] temp = new int[10][arr.length]; // 数组的第一维表示可能的余数0-9
int[] order = new int[10]; // 数组orderp[i]用来表示该位是i的数的个数
while (m <= d) {
for (int i = 0; i < arr.length; i++) {
int lsd = ((arr[i] / n) % 10);
temp[lsd][order[lsd]] = arr[i];
order[lsd]++;
}
for (int i = 0; i < 10; i++) {
if (order[i] != 0)
for (int j = 0; j < order[i]; j++) {
arr[k] = temp[i][j];
k++;
}
order[i] = 0;
}
n *= 10;
k = 0;
m++;
}
return arr;
}
不稳定排序算法性能比较

选择排序代码:
/**
* 选择排序
*
* @param arr
* @return
*/
public int[] selectSort(int[] arr) {
int temp;
for (int i = 0; i < arr.length; i++) {
int minus = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[i])
minus = j;
}
if (minus != i) {
temp = arr[i];
arr[i] = arr[minus];
arr[minus] = temp;
}
}
return arr;
}
希尔排序代码:
/**
* 希尔排序
*/
public int[] shllSort(int[] arr) {
int dk = arr.length / 2;
while (dk >= 1) {
for (int i = 0; i < dk; i++) {
for (int j = i + dk; j < arr.length; j = j + dk) {
if (arr[j] < arr[j - dk]) {
int temp = arr[j];
int k = j;
while (k > i && arr[k - dk] > temp) {
arr[k] = arr[k - dk];
k = k - dk;
}
arr[k] = temp;
}
}
}
dk = dk / 2;
} return arr;
}
}
快速排序代码:
/**
* 快速排序
*
* @param arr
* 待排序数组
* @param left
* 待排序数组左边界
* @param right
* 待排序数组右边界
* @return
*/
public int[] quickSort(int[] arr, int left, int right) {
int temp;
if (left < right) {
int s = arr[left];
int i = left;
int j = right;
while (true) {
while (i + 1 < arr.length && arr[++i] < s)
;
while (j - 1 > -1 && arr[--j] > s)
;
if (i >= j)
break;
else {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
arr[left] = arr[j];
arr[j] = s;
quickSort(arr, left, j - 1);
quickSort(arr, j + 1, right);
}
return arr;
} /**
* 快速排序第二种实现方式
*
* @param arr
* 待排序数组
* @param left
* 待排序数组左边界
* @param right
* 待排序数组右边界
* @return
*/
public int[] quickSort2(int[] arr, int left, int right) {
if (left < right) {
int key = arr[left];
int low = left;
int high = right;
while (low < high) {
while (high > low && arr[high] >= key)
high--;
arr[low] = arr[high];
while (low < high && arr[low] <= key)
low++;
arr[high] = arr[low];
}
arr[low] = key;
quickSort2(arr, left, low - 1);
quickSort2(arr, low + 1, right);
}
return arr;
}
Java实现基本排序算法的更多相关文章
- Java中的排序算法(2)
Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...
- java实现各种排序算法
java实现各种排序算法 import java.util.Arrays; public class SomeSort { public static void main(String[] args) ...
- Java实现常见排序算法
常见的排序算法有冒泡排序.选择排序.插入排序.堆排序.归并排序.快速排序.希尔排序.基数排序.计数排序,下面通过Java实现这些排序 1.冒泡排序 package com.buaa; import j ...
- Java数组的排序算法
在Java中,实现数组的排序算法有很多,如冒泡排序法.选择排序法.直接插入法和快速排序法等.下面介绍几种排序算法的具体 实现. 本文引用文献:Java必须知道的300个问题. 1.冒泡排序法 1.1 ...
- java实现八大排序算法
Arrays.sort() 采用了2种排序算法 -- 基本类型数据使用快速排序法,对象数组使用归并排序. java的Collections.sort算法调用的是归并排序,它是稳定排序 方法一:直接插入 ...
- java实现折半排序算法
折半插入排序法,又称二分插入排序法,是直接插入排序法的改良版,也需要执行i-1趟插入,不同之处在于,第i趟插入,先找出第i+1个元素应该插入的的位置,假定前i个数据是已经处于有序状态. 折半插入排序( ...
- JAVA简单选择排序算法原理及实现
简单选择排序:(选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1) 复杂度: ...
- Java版各种排序算法 (冒泡,快速,选择,插入)
package com.test4; import java.util.*; //Calendar 显示时间 /** * @author qingfeng * 功能:排序算法 */ public cl ...
- Java学习笔记——排序算法之快速排序
会当凌绝顶,一览众山小. --望岳 如果说有哪个排序算法不能不会,那就是快速排序(Quick Sort)了 快速排序简单而高效,是最适合学习的进阶排序算法. 直接上代码: public class Q ...
- Java学习笔记——排序算法之希尔排序(Shell Sort)
落日楼头,断鸿声里,江南游子.把吴钩看了,栏杆拍遍,无人会,登临意. --水龙吟·登建康赏心亭 希尔算法是希尔(D.L.Shell)于1959年提出的一种排序算法.是第一个时间复杂度突破O(n²)的算 ...
随机推荐
- .net Path 类
检索文件扩展名. GetExtension 检索文件的完全限定路径. GetFullPath 检索路径中的文件名和扩展名. GetFileName 只检索路径中的文件名. GetFileNameW ...
- 微信js-sdk分享详解及demo实例
步骤一:绑定域名 先登录微信公众平台进入"公众号设置"的"功能设置"里填写"JS接口安全域名". 步骤二:引入JS文件 在需要调用JS接口的 ...
- (转载)公开的海量数据集 Public Research-Quality Datasets
转载自:http://rensanning.iteye.com/blog/1601663 海量数据数据集 海量数据(又称大数据)已经成为各大互联网企业面临的最大问题,如何处理海量数据,提供更好的解决方 ...
- b64_md5加密Java、JavaScript实现
问题说明 MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串).经过md5后的字符数组中含有 ...
- 转每天一个linux命令(8):cp 命令
cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是 ...
- Connector
增加project bar窗口,在编辑大规模工程电路时,方便管理电路的各个层次,在分页编辑大规模工程电路时,可以用place中的off-page connector 进行每一页的联接.
- Hibernate注解-类级别注解
- 关于sys.argv
sys.argv[]用来获取命令行参数,sys.argv[0]表示代码本身的文件路径.比如在命令行输入‘python test.py -version',sys.argv[0]的值即为test.py, ...
- Mysql分页处理(PageHelper)
第一次做分页处理(完全不知道分页处理到底要做成什么样?) 理解:其实就是前台页面通过传递不同的参数{1.查询的条件.2.查询页数(pageNum),3每页展现的条数(pageSize)},之后我们(只 ...
- vue父子组件通信
一.父子组件间通信 vue.js 2.0提供了一个ref 的属性: 可以为子组件指定一个索引id 父组件: <template> <div id='user-login'> & ...