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. Redis消息通知

    Redis的消息通知通过列表类型实现,分为两种模式:阻塞式.发布/订阅式: 阻塞式 顾名思义,消息生产者负责生产消息,并将消息放到队列的一端,消息的消费者负责消费消息,从队列的另一端取出消息,然后对其 ...

  2. Java创建对象的原则

    开闭原则 可以通过“抽象约束.封装变化”来实现开闭原则,即通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中 里氏替换原则 里氏替换原则通俗来讲就是:子类 ...

  3. numpy库数组属性查看:类型、尺寸、形状、维度

    import numpy as np   q = np.array([1,2,3,4],dtype=np.complex128)    print("数据类型",type(q))  ...

  4. TZOJ 5094 Stringsobits(DP)

    描述 Consider an ordered set S of strings of N (1 <= N <= 31) bits. Bits, of course, are either ...

  5. JAVA面试常见问题之开源框架和容器篇

    1.Servlet的生命周期 加载:加载到虚拟机 初始化:init() 一个生命周期中只会被调用一次. 服务:service() 销毁:destroy() 2.转发与重定向的区别 转发在服务器端完成的 ...

  6. copyTo和clone的区别/制作mask的fillpoly函数(有问题)

    OpenCV中mat::copyto( )函数使用方法 OpenCV的fillPoly函数 使用OpenCV库进行图像处理时,经常会用到clone和copyTo函数,这里对两个函数进行介绍. copy ...

  7. PHP1.9--数组

    1.array_slice()函数作用是在数组中根据条件取出一段值并返回,如果数组有字符串键,所返回的数组将保留健名 array array_slice(array array ,int offset ...

  8. 使用 WPF 生成图形

    下载代码示例 基于一组与测试有关的数据来生成图形是一项常见的软件开发任务.根据我的经验,最常用的方法是将数据导入 Excel 电子表格,然后使用 Excel 内置的绘图功能手动生成图形.这种做法适用于 ...

  9. spring cloud深入学习(六)-----熔断监控Hystrix Dashboard和Turbine

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  10. 日志lombok插件安装及配置

    安装lombok插件 下载Lombok.jar http://projectlombok.googlecode.com/files/lombok.jar 运行Lombok.jar java -jar ...