排序,有内排序和外排序

内排序,是在内存中进行

外排序,是在磁盘上进行

内排序根据是否使用比较大小的方法,又分比较排序和非比较排序

首先,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:直接插入排序

直接插入排序是将未排序的数据插入至已排好序序列的合适位置。

思路:具体流程如下:
  1、首先比较数组的前两个数据,并排序;
  2、比较第三个元素与前两个排好序的数据,并将第三个元素放入适当的位置;
  3、比较第四个元素与前三个排好序的数据,并将第四个元素放入适当的位置;
   ......
  4、直至把最后一个元素放入适当的位置。
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 中常见的各种排序算法汇总的更多相关文章

  1. Java常用的7大排序算法汇总

    1.插入排序算法 插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k 的过 ...

  2. Java中的数据结构及排序算法

    (明天补充) 主要是3种接口:List Set Map List:ArrayList,LinkedList:顺序表ArrayList,链表LinkedList,堆栈和队列可以使用LinkedList模 ...

  3. 排序算法汇总(C/C++实现)

    前言:     本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...

  4. 程序兵法:Java String 源码的排序算法(一)

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第103篇原创 <程序兵法:Java Str ...

  5. Java基础复习笔记基本排序算法

    Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...

  6. JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)

    1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...

  7. java中常见的六种线程池详解

    之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如 ...

  8. Java中常见的5种WEB服务器介绍

    这篇文章主要介绍了Java中常见的5种WEB服务器介绍,它们分别是Tomcat.Resin.JBoss.WebSphere.WebLogic,需要的朋友可以参考下 Web服务器是运行及发布Web应用的 ...

  9. Java中常见的Exception种类

    Java中常见的Exception种类 1.ClassNotFoundException 2.IOException 3.NoSuchFieldException 4.NoSuchMethodExce ...

随机推荐

  1. 纯js实现移动端滑动控件,以上下滑动自取中间位置年龄为例;

    <!-- 需求:上下滑动,在一个大的div块里显示5个小的值,滑动过程中自动获取中间位置的值 需要注意的是: 1 touchmove会多次被触发: 2 获取中间位置的值可以通过定位得top值来获 ...

  2. sql server还原注意事项

    使用Sql Server 2000的数据库备份文件还原Sql Server 2000的数据库和还原Sql Server 2005的数据库区别:1.在还原至Sql 2000时是必须新建数据库并对其还原, ...

  3. to refactor for refactor

    v1.1 if all algorithm are in one function, it will expand. so each operate type should be separated. ...

  4. 用Intellij IDEA建mybatis案例

    用IDEA建mybatis案例 环境准备: 首先,建库建表(最好用navicat或sqlpro直接导) 然后打开IDEA, 1. java--->javaEE---> java app-- ...

  5. PHP中array_map与array_column之间的关系分析

    array_map()与array_column()用法如下: array_map();将回调函数作用到给定数组的单元上array_column();快速实现:将二维数组转为一维数组 array_co ...

  6. Mac下Homebrew的安装与使用

    Homebrew简介,安装与使用 简介 Homebrew 官方网站 Homebrew是一个包管理器,用于安装Apple没有预装但你需要的UNIX工具.(比如著名的wget). Homebrew会将软件 ...

  7. UI自动化(一)html基础

    前端的三把利器 HTML:赤裸的一个人 CSS:华丽的衣服 JS/JavaScript:赋予这个人的行为,也就是动起来 DOM 就是将页面变成可操 HTML(超文本标记语言) html代码实际上就是一 ...

  8. JavaScript中冒泡与事件委托

    冒泡 事件触发后事件流的三个阶段按顺序依次是: 1.捕获阶段 2.目标阶段 3.冒泡阶段 大盒子包裹小盒子,两个盒子都分别添加点击事件,当点击小盒子,两个盒子的事件都会触发. 事件委托 下级元素委托上 ...

  9. QT---实现舒尔特方格(零基础入门)

    按照之前说的,加上舒尔特方格,读者还可以自行将此游戏做成APP放到手机上,后面还有贪吃蛇,Java版的飞机大战,五子棋,各类游戏会不断加上来的,当然,会免费附加源代码! 读者可以去4399去玩一下,可 ...

  10. 【Python045-魔法方法:属性访问】

    一.属性的几种访问方式 1.类.属性名 >>> class C: def __init__(self): self.x = 'X-man' >>> c = C() ...