Java排序需掌握算法 详解
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排序需掌握算法 详解的更多相关文章
- 八大排序算法详解(动图演示 思路分析 实例代码java 复杂度分析 适用场景)
一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...
- javascript 中合并排序算法 详解
javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的... 合并排序代码如下: <script type="text/javascript& ...
- Java网络编程和NIO详解9:基于NIO的网络编程框架Netty
Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...
- Java中的main()方法详解
在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...
- 【转】AC算法详解
原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...
- 安全体系(三)——SHA1算法详解
本文主要讲述使用SHA1算法计算信息摘要的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 安全体系(二)——RSA算法详解 为保 ...
- Elasticsearch java api 基本搜索部分详解
文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...
- java 关键字final static native详解
java 关键字native static final详解 一.final 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义, ...
- 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?
简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...
随机推荐
- redis学习笔记06-主从复制和哨兵机制
1.主从复制 为了保证线上业务的持续运行,防止主节点因宕机而重启数据恢复消耗太长时间,通常会准备一个备用节点,备份主节点的数据,当主节点出问题时立马顶上.这种机制就叫做主从复制.在了解redis的主从 ...
- Tomcat服务器的安装及配置
学习目标: 了解Tomcat服务器的主要作用 掌握Tomcat服务器的安装与配置 掌握Tomcat安装目录下主要文件夹的作用 jsp的执行流程 1.Web的工作原理流程图:从图中可以看出Tomcat服 ...
- qq邮箱html邮件,图片不显示的问题
测试无论是站外的图片还是站内的图片,qq邮箱都会过滤图片,导致显示不出来. 解决办法:图片base64编码.效果图: 代码: <div class="container"&g ...
- Redis源码解析:28集群(四)手动故障转移、从节点迁移
一:手动故障转移 Redis集群支持手动故障转移.也就是向从节点发送"CLUSTER FAILOVER"命令,使其在主节点未下线的情况下,发起故障转移流程,升级为新的主节点,而原 ...
- Django项目:CRM(客户关系管理系统)--34--26PerfectCRM实现King_admin自定义排序
ordering = ['-qq'] #自定义排序,默认'-id' #base_admin.py # ————————24PerfectCRM实现King_admin自定义操作数据———————— f ...
- [转] Blob对象
Blob是计算机界通用术语之一,全称写作:BLOB(binary large object),表示二进制大对象.MySql/Oracle数据库中,就有一种Blob类型,专门存放二进制数据.在javas ...
- loading遮罩
.loading{ position: relative; cursor: default; point-events: none; text-shadow: none!important; colo ...
- WPF 从属性赋值到MVVM模式详解
示例源码 这两天学习了一下MVVM模式,和大家分享一下,也作为自己的学习笔记.这里不定义MVVM的概念,不用苍白的文字说它的好处,而是从简单的赋值讲起,一步步建立一个MVVM模式的Simple.通过前 ...
- 碰撞的小球 ccf (模拟)
问题描述 试题编号: 201803-2 试题名称: 碰撞的小球 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐 ...
- 洛谷 P3742 umi的函数【构造】
题目背景(https://www.luogu.org/problemnew/show/P3742) umi 找到了一个神秘的函数 f. 题目描述 这个函数接受两个字符串 s1,s2.这些字符串只能由小 ...