Java 中常见的各种排序算法汇总

排序,有内排序和外排序
内排序,是在内存中进行
外排序,是在磁盘上进行
内排序根据是否使用比较大小的方法,又分比较排序和非比较排序
首先,Java中自已是有排序的
说明:
(1)Arrays类中的sort()使用的是“经过调优的快速排序法”;
(2)比如int[],double[],char[]等基数据类型的数组,Arrays类之只是提供了默认的升序排列,没有提供相应的降序排列方法。
(3)要对基础类型的数组进行降序排序,需要将这些数组转化为对应的封装类数组,如Integer[],Double[],Character[]等,对这些类数组进行排序。(其实还不如先进行升序排序,自己在转为将序)。
import java.util.Arrays;
public class TestSort {
int a[] = {1, 2, 3, 4, 5, 6, 7};
int temp;
@Test(priority = 1, description = "利用Arrays中的Sort函数排序")
public void ArraysSort() {
Arrays.sort(a);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
}
Step01:冒泡排序
原理:比较两个相邻的元素,将值大的元素交换至一端。
思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。
即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。
然后比较第2个数和第3个数,将小数放前,大数放后,
如此继续,直至比较最后两个数,将小数放前,大数放后。
重复第一趟步骤,直至全部排序完成。
public class Sort01_BubbleSort {
public static void main(String agrs[]) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
System.out.println("\n"+arr.length);
System.out.println("before sort:");
for (int num : arr) {
System.out.print(num + " ");
}
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1-i; j++) {
if (arr[j] > arr[j + 1]) {//if 后一位的数小,将被往前移动
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
System.out.println("\n"+"---第"+(i+1)+"轮第"+(j+1)+"次-----");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
System.out.println("\n"+"---");
System.out.println("after sort:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
查看具体执行的过程:
"C:\Program Files\Java\jdk1.8.0_161\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\lib\idea_rt.jar=55246:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;D:\00M_IDEA_Project\mavenDemo_idea01\target\classes" Sort01_BubbleSort 10
before sort:
1 2 3 4 5 6 7 8 9 0
---第1轮第1次-----
1 2 3 4 5 6 7 8 9 0
---第1轮第2次-----
1 2 3 4 5 6 7 8 9 0
---第1轮第3次-----
1 2 3 4 5 6 7 8 9 0
---第1轮第4次-----
1 2 3 4 5 6 7 8 9 0
---第1轮第5次-----
1 2 3 4 5 6 7 8 9 0
---第1轮第6次-----
1 2 3 4 5 6 7 8 9 0
---第1轮第7次-----
1 2 3 4 5 6 7 8 9 0
---第1轮第8次-----
1 2 3 4 5 6 7 8 9 0
---第1轮第9次-----
1 2 3 4 5 6 7 8 0 9
---第2轮第1次-----
1 2 3 4 5 6 7 8 0 9
---第2轮第2次-----
1 2 3 4 5 6 7 8 0 9
---第2轮第3次-----
1 2 3 4 5 6 7 8 0 9
---第2轮第4次-----
1 2 3 4 5 6 7 8 0 9
---第2轮第5次-----
1 2 3 4 5 6 7 8 0 9
---第2轮第6次-----
1 2 3 4 5 6 7 8 0 9
---第2轮第7次-----
1 2 3 4 5 6 7 8 0 9
---第2轮第8次-----
1 2 3 4 5 6 7 0 8 9
---第3轮第1次-----
1 2 3 4 5 6 7 0 8 9
---第3轮第2次-----
1 2 3 4 5 6 7 0 8 9
---第3轮第3次-----
1 2 3 4 5 6 7 0 8 9
---第3轮第4次-----
1 2 3 4 5 6 7 0 8 9
---第3轮第5次-----
1 2 3 4 5 6 7 0 8 9
---第3轮第6次-----
1 2 3 4 5 6 7 0 8 9
---第3轮第7次-----
1 2 3 4 5 6 0 7 8 9
---第4轮第1次-----
1 2 3 4 5 6 0 7 8 9
---第4轮第2次-----
1 2 3 4 5 6 0 7 8 9
---第4轮第3次-----
1 2 3 4 5 6 0 7 8 9
---第4轮第4次-----
1 2 3 4 5 6 0 7 8 9
---第4轮第5次-----
1 2 3 4 5 6 0 7 8 9
---第4轮第6次-----
1 2 3 4 5 0 6 7 8 9
---第5轮第1次-----
1 2 3 4 5 0 6 7 8 9
---第5轮第2次-----
1 2 3 4 5 0 6 7 8 9
---第5轮第3次-----
1 2 3 4 5 0 6 7 8 9
---第5轮第4次-----
1 2 3 4 5 0 6 7 8 9
---第5轮第5次-----
1 2 3 4 0 5 6 7 8 9
---第6轮第1次-----
1 2 3 4 0 5 6 7 8 9
---第6轮第2次-----
1 2 3 4 0 5 6 7 8 9
---第6轮第3次-----
1 2 3 4 0 5 6 7 8 9
---第6轮第4次-----
1 2 3 0 4 5 6 7 8 9
---第7轮第1次-----
1 2 3 0 4 5 6 7 8 9
---第7轮第2次-----
1 2 3 0 4 5 6 7 8 9
---第7轮第3次-----
1 2 0 3 4 5 6 7 8 9
---第8轮第1次-----
1 2 0 3 4 5 6 7 8 9
---第8轮第2次-----
1 0 2 3 4 5 6 7 8 9
---第9轮第1次-----
0 1 2 3 4 5 6 7 8 9
---
after sort:
0 1 2 3 4 5 6 7 8 9
Process finished with exit code 0

Step02:选择排序
原理:每一趟从待排序的记录中选出最小的元素,放到一端。
思路:第一次从记录中选择最小的数放到一端,第二次动剩下的记录中选择最小的,放到第二位
依次往下,直到全部排序完成。
public class Sort02_SelectionSort {
public static void main(String[] args) {
int[] arr = {4,13,2,1};
System.out.println("\n" + arr.length);
System.out.println("交换之前:");
for (int num : arr) {
System.out.print(num + " ");
}
//选择排序
for (int i = 0; i < arr.length - 1; i++) {
int k = i;
for (int j = k + 1; j < arr.length; j++) {
if (arr[j] < arr[k]) {
k = j; //记下目前找到的最小值所在的位置
}
}
//在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换
if (i != k) { //交换a[i]和a[k]
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
System.out.println("\n"+"---第"+(i+1)+"轮找到最小数的位置是第"+(k+1)+"个数-----");
for (int num : arr) {
System.out.print(num + " ");
}
}
System.out.println();
System.out.println("交换后:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
查看具体执行过程
"C:\Program Files\Java\jdk1.8.0_161\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\lib\idea_rt.jar=57407:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;D:\00M_IDEA_Project\mavenDemo_idea01\target\classes" Sort02_SelectionSort 4
交换之前:
4 13 2 1
---第1轮找到最小数的位置是第4个数-----
1 13 2 4
---第2轮找到最小数的位置是第3个数-----
1 2 13 4
---第3轮找到最小数的位置是第4个数-----
1 2 4 13
交换后:
1 2 4 13
Process finished with exit code 0

Step03:直接插入排序
直接插入排序是将未排序的数据插入至已排好序序列的合适位置。
import java.util.Arrays;
public class Sort03_InsertSort {
public static void main(String[] args) {
int[] arr = {4, 13, 2, 1};
System.out.println("\n" + arr.length);
System.out.println("交换之前:");
for (int num : arr) {
System.out.print(num + " ");
}
System.out.println("\n");
int tmp;
for (int i = 1; i < arr.length; i++) {
// 待插入数据
tmp = arr[i];
int j;
for (j = i - 1; j >= 0; j--) {
// 判断是否大于tmp,大于则后移一位
if (arr[j] > tmp) {
arr[j + 1] = arr[j];
} else {
break;
}
}
arr[j + 1] = tmp;
System.out.println(i + ":" + Arrays.toString(arr));
}
}
}
private void quickSort(int[] arr, int low, int high) {
int i,j,temp,t;
if(low>high){
return;
}
i=low;
j=high;
//temp就是基准位
temp = arr[low];
while (i<j) {
//先看右边,依次往左递减
while (temp<=arr[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (temp>=arr[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = temp;
//递归调用左半数组
quickSort(arr, low, j-1);
//递归调用右半数组
quickSort(arr, j+1, high);
}
快速排序
import java.util.Arrays; /**
* 快速排序的测试
*
*/
public class TestSort { public int[] arr = new int[] { 7, 2, 4, 6, 0, 0, 0, 1, 6 }; public int[] sort2(int[] datas, int low, int high) {
int i = low, j = high, key = datas[low], tmp;
while (i < j) {
while (i < j && datas[j] >= key) {
j--;
}
while (i < j && datas[i] < key) {
i++;
}
if (i < j) {
tmp = datas[i];
datas[i] = datas[j];
datas[j] = tmp;
}
}
if (i - low > 0) {
sort2(datas, low, i);
}
if (high - i > 1) {
sort2(datas, i + 1, high);
}
return datas;
} /**
* 测试主方法
*
* @param args
*/
public static void main(String args[]) {
TestSort q = new TestSort();
int[] t = q.arr;
q.sort2(t, 0, t.length - 1);
System.out.println(Arrays.toString(t));
}
}
Java 中常见的各种排序算法汇总的更多相关文章
- Java常用的7大排序算法汇总
1.插入排序算法 插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k 的过 ...
- Java中的数据结构及排序算法
(明天补充) 主要是3种接口:List Set Map List:ArrayList,LinkedList:顺序表ArrayList,链表LinkedList,堆栈和队列可以使用LinkedList模 ...
- 排序算法汇总(C/C++实现)
前言: 本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...
- 程序兵法:Java String 源码的排序算法(一)
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第103篇原创 <程序兵法:Java Str ...
- Java基础复习笔记基本排序算法
Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...
- JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)
1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...
- java中常见的六种线程池详解
之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如 ...
- Java中常见的5种WEB服务器介绍
这篇文章主要介绍了Java中常见的5种WEB服务器介绍,它们分别是Tomcat.Resin.JBoss.WebSphere.WebLogic,需要的朋友可以参考下 Web服务器是运行及发布Web应用的 ...
- Java中常见的Exception种类
Java中常见的Exception种类 1.ClassNotFoundException 2.IOException 3.NoSuchFieldException 4.NoSuchMethodExce ...
随机推荐
- ES6知识整理(10)--class的继承
(这是es6的第10篇文章.说真的这样的总结之后虽然直观了许多,但是消耗的时间有点长,或许是知识比较复杂的原因吧) 类的继承 有个A类,B类继承A类,那B类实例就可以使用A类实例的所以属性和方法.不包 ...
- Eloquent JavaScript #13# HTTP and Forms
索引 Notes fetch form focus Disabled fields form’s elements property 阻止提交 快速插入单词 实时统计字数 监听checkbox和rad ...
- 用Java实现MVPtree——MVPtree点集内去重以及衍生出来的多维向量Hash问题
上次完成了MVPtree之后,客户又提出了MVPtree点集元素重复的问题,希望我将元素去重. 集合去重哪家强?java.util找HashSet!如果不计较元素顺序,放进去基本就没有重复元素了. 只 ...
- Spring Boot 2(一):Spring Boot 2.0新特性
Spring Boot 2(一):Spring Boot 2.0新特性 Spring Boot依赖于Spring,而Spring Cloud又依赖于Spring Boot,因此Spring Boot2 ...
- ora-904 rowid create materialized view
create materialized view t_v asselect t1.*,1 as marker,rowid from t1 t1union allselect t2.*,2 as mar ...
- 【题解】Luogu P2783 有机化学之神偶尔会做作弊
原题链接:P2783 有机化学之神偶尔会做作弊 一看,是黑题,太毒瘤了,不写 什么单链??! 只会画有机化学中正六边形的我觉得这样不行QAQ(我才初二) 当然,题目也给你了详细的解释 实际呢,这道题先 ...
- opencv学习之路(4)、Mat类介绍,基本绘图函数
一.Mat类创建 Mat img;//创建无初始化矩阵 Mat img1(,,CV_8UC1);//200行,100列(长200,宽100) Mat img2(Size(,),CV_8UC3,Scal ...
- map的迭代器
Iterator<Entry<String,String>> iter=map.entrySet().iterator(); map的迭代器,用作遍历map中的每一个键值对 I ...
- 【做题】arc072_f-Dam——维护下凸包
题意:有一个容量为\(L\)的水库,每天晚上可以放任意体积的水.每天早上会有一定温度和体积的水流入水库,且要保证流入水之后水的总体积不能超过\(L\).令体积分别为\(V_1,V_2\),温度分别为\ ...
- [转] Java中的final、static、this、super
final 关键字 final关键字主要用在三个地方:变量.方法.类. 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改:如果是引用类型的变量,则在对其初始化之后便 ...