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²)的算 ...
随机推荐
- C3P0数据库连接池使用中的问题
java.io.FileNotFoundException: D:\javaStudy\javaee\.metadata\.plugins\org.eclipse.wst.server.core\tm ...
- 【windows】常用快捷键
浏览器 ctrl shift del 清除网页缓存 文件系统 win+e 打开文件窗口 win+r 运行命令窗口 win+l 锁定桌面 win+m 最小化窗口 ctrl+shift +n 创建文件夹
- WeQuant交易策略—BOLL
BOLL(布林线指标)策略 简介 BOLL(布林线)指标是技术分析的常用工具之一,由美国股市分析家约翰•布林根据统计学中的标准差原理设计出来的一种非常简单实用的技术分析指标.一般而言,价格的运动总是围 ...
- 关于原根的存在性及个数(Primitive Root Theorem)
我在RSA学习总结的第三部分关于Mille-Rabin素数测试的正确性证明里需要用到此定理,由于证明太长,故另开一章于此.(为啥我说话突然文绉绉了Orz,可能是这周辩论打多了) 结论是对素数p,mod ...
- 迈向angularjs2系列(6):路由机制
目录1.angular-seed的路由2.路由机制的探索3.懒加载 一:angular-seed的路由 step1:安装种子项目 $ git clone --depth 1 https://gi ...
- mysql简单主从复制(二)
mysql的简单主从复制 主从复制打开后,各自开启的线程: master端 mysql> show processlist\G; *************************** 1. r ...
- 两台主机之间单向Ping不通的问题
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } p.p2 ...
- 这是一款借助chrome 插件的微信机器人
1.chrome kit微信机器人简介 借助chrome 插件 js注入来实现消息的发送 chrome devtool api的调用来监听https请求 打开微信登录界面,在扫码登录前必须先打开too ...
- 最近做了一个通达OA的大料:20170905最新版本破解可改单位名称,无限制安装
最近做了一个通达OA的大料:20170905最新版本破解可改单位名称,无限制安装 用户约七十家,总体不错,修改了两次注册授权文件,完美使用中 可联系麦枫http://www.mfsun.com管理员Q ...
- grunt对象之api
grunt已经扯了七篇了,殊为不易.最后一篇扯点早应该提及的东西,就是module.exports = function(grunt) {}传入的这个grunt.之前的代码grunt一般只出现在Gru ...