package com.sxt.review;

/*内部排序:(在内存)
* 插入排序-->希尔排序
* 冒泡排序-->快速排序
* 选择排序-->堆排序
* 归并排序
* 基数排序
* 外部排序:(排序过程需访问外存)
*/
import java.util.Arrays; public class TestSort {
public static void main(String[] args) {
int[] arr = { 2, 45, 3, 0, 7, 9, 2, 88 };
// BubbleSort(arr);
// System.out.println("冒泡排序:"+Arrays.toString(arr));
// ChoiceSort(arr);
// System.out.println("选择排序:"+Arrays.toString(arr));
// InsertSort(arr);
// System.out.println("插入排序:" + Arrays.toString(arr));
quickSort(arr, 0, arr.length - 1);
System.out.println("快速排序:" + Arrays.toString(arr));
}
//快速排序---------------------------------------------------------------
//快速排序:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,
// 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
private static void quickSort(int[] arr, int left, int right) {
// 设置两个运动标记 记录所操作的数的下标
int i = left;
int j = right;
// 递归结束条件 每趟都是i==j时确定基准值位置
if (i < j) {
// 一趟快速排序
int midValue = arr[i]; // 每次以左边第一个数作为基准值midValue 记录midValue并为插入小的数做准备
while (i < j) {
while (i < j && arr[j] >= midValue) { // 循环! 从后往前依次和基准值比较
// 注意保证i<j !!
j--; // 最后一次 i指向小于基准值的数
}
if (i < j) {
arr[i] = arr[j];// 小的数插入左边标记(i)的位置
i++;// 左边标记向右移动一位 做准备
} while (i < j && arr[i] <= midValue) {// 循环! 从前往后依次和基准值比较
i++; // 最后一次 i指向大于基准值的数
}
if (i < j) {
arr[j] = arr[i];// 大的数插入右边标记(j)的位置(数据已记录)
j--;//右边的标记向左移动一位 做准备
}
}
arr[i] = midValue;// i==j时 确定基准值的位置!
// 递归体
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
}
//插入排序---------------------------------------------------------------
// 插入排序 从第二个数开始将无序表数据依次插入到有序表的适当位置
private static void InsertSort(int[] arr) {
// 控制趟数
for (int i = 1; i < arr.length; i++) {// 从第二个数开始依次比较插入 第一个数为有序表
int insertVal = arr[i];// 记录要插入的数 防止有序表后移的数覆盖
int insertPos = i - 1;// 记录插入的初始位置:无序表的前一位置(即从从本位置开始往前判断)
while (insertPos >= 0 && insertVal < arr[insertPos]) {// index>=0:防止有序表越界
arr[insertPos + 1] = arr[insertPos];// 大的后移(当前数后移)
insertPos--;// 迭代条件 有序表继续往前判断
}
// 无序表待插入的值 插入 到有序表的最终位置
arr[insertPos + 1] = insertVal;// +1:因为上面迭代-1
System.out.println("插入排序:" + Arrays.toString(arr));
}
}
//选择排序---------------------------------------------------------------
// 选择排序:每次选择一个最值放到最终位置 (以最小值为例)每趟的数最小值放到最前
private static void ChoiceSort(int[] arr) {
int temp = 0;
for (int i = 0; i < arr.length - 1; i++) {// n-1趟
int minIndex = i;// 初始最小值
for (int j = i + 1; j < arr.length; j++) {// i:每次前面少排序一个数
// +1:从初始i的下个数开始比较
if (arr[minIndex] > arr[j]) {
minIndex = j;// 记录真实最小值下标 为交换做准备
}
}
// 初始最小值和真实最小值交换位置
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
//冒泡排序---------------------------------------------------------------
// 冒泡排序 两两交换 大的一路向右
private static void BubbleSort(int[] arr) {
int temp = 0;
for (int i = 0; i < arr.length - 1; i++) {// n-1趟
boolean flag = true;
for (int j = 0; j < arr.length - i - 1; j++) {// -i:每次少排一个数 -1
// arr[j+1]防止越界
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = false;
}
}
if (flag) {// 如果没有发生交换说明已经有序 可以直接退出循环
break;
}
}
} }

附上 插入排序手工排序过程

Java排序需掌握算法 详解的更多相关文章

  1. 八大排序算法详解(动图演示 思路分析 实例代码java 复杂度分析 适用场景)

    一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...

  2. javascript 中合并排序算法 详解

    javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的...  合并排序代码如下: <script type="text/javascript& ...

  3. Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

    Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...

  4. Java中的main()方法详解

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...

  5. 【转】AC算法详解

    原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...

  6. 安全体系(三)——SHA1算法详解

    本文主要讲述使用SHA1算法计算信息摘要的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 安全体系(二)——RSA算法详解 为保 ...

  7. Elasticsearch java api 基本搜索部分详解

    文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...

  8. java 关键字final static native详解

    java 关键字native static final详解 一.final 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义, ...

  9. 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?

    简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...

随机推荐

  1. 跟我一起做一个vue的小项目(五)

    接下来我们要做的是热门推荐页面,我们写一个推荐组件 使用的方法也是前端data中的数据渲染到页面上面,这里对文字过长取省略号的方法不成功使用了一个小技巧 使用了min-width:0 我们来看完整的代 ...

  2. div 无缝滚动

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org ...

  3. SPOJ 2916 GSS5 - Can you answer these queries V

    传送门 解题思路 和GSS1相似,但需要巨恶心的分类讨论,对于x1<=y1< x2< =y2 这种情况 , 最大值应该取[x1,y1]的右端最大+[y1+1,x2-1]的和+[x2, ...

  4. 正则中使用ASCII码,取值范围

    [^\x00-\xFF]  : 表示匹配Ascii码大于255的那些字符 基于浏览器的工具: https://regexr.com/

  5. ajax--表单带file数据提交报错Uncaught TypeError: Illegal invocation

    只要设置 contentType: false, //不设置内容类型 processData: false, //不处理数据 $("#btn").on("click&qu ...

  6. redis订阅自动退出

    1.打开报错, error_reporting(E_ALL);ini_set('display_errors', '1'); 2.没有报错,不是php最大执行时间问题,原因是socket超时3.有设置 ...

  7. Java是如何实现跨平台的

    一.Java是如何实现跨平台的 1.我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件 2.Java虚拟机JVM就是负责将字节码文件翻译成特定平台下的机器码然后运行.也就是说 ...

  8. netbeans生成的maven工程没有web.xml文件 如何新建

    使用netbeans生成的maven工程没有web.xml 需要自己新建 步骤: 下一步,完成

  9. union /union all/ intersect / minus

  10. JS Ajax跨域访问

    js ajax跨域访问报"No 'Access-Control-Allow-Origin' header is present on the requested resource 如果请求的 ...