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算法类似.该算法名称以 ...
随机推荐
- NOIP2017解题报告
啊不小心点发布了,懒得删了就这样吧,虽然还没写完,也不打算写了大概. d1t1 结论题 没什么好说的 d1t2 模拟 没什么好说的 d1t3 70分算法其实比较好想. 没有0边,就跑最短路,然后按di ...
- 移动端 Iphone拍照变横问题的解决
在移动端的页面需要做用户拍照上传的功能时会有用,苹果即使竖着拍照,上传到网页后它也会变成横的,好像IOS得一个BUG,安卓就没有这个问题. 要解决这个问题需要引入exif.js这个库,网上随便搜一下就 ...
- WPF 从属性赋值到MVVM模式详解
示例源码 这两天学习了一下MVVM模式,和大家分享一下,也作为自己的学习笔记.这里不定义MVVM的概念,不用苍白的文字说它的好处,而是从简单的赋值讲起,一步步建立一个MVVM模式的Simple.通过前 ...
- git仓库远程连接GitHub
1 先下载git for windows 然后一直点下一步安装. 2 安装之后,选择git gui.生成ssh 链接 git 公钥. 用命令也可以: $ ssh-keygen -t rsa -C &q ...
- 轮播图js版&jQ版
JS版轮播图 html部分和css部分自己任意定 主要构成: 1,一个固定的框 超出框的部分隐藏 2,几张图片float:left 3,下部下原点,点击切换,切换到不同的张都有红色显示 4,左右两个大 ...
- LINUX常见服务列表
服务名 必需(是/否)用途描述 注解 acon 否 语言支持 特别支持左手书写语言:阿拉伯语,波斯语和希伯莱语 acpi ...
- ue4同c#通信时的中文乱码问题
转:https://blog.csdn.net/XIAOZHI0999/article/details/80785570 本文讨论C#同ue4进行通信,出现的中文乱码情况,其他语言类似. 本文分两种情 ...
- selenium(1):python3.6.4+selenium3.0+chrome环境配置
本文为配置过程: python 1.python3.6.4下载安装见python安装说明.(本博客) 2.安装python的集成编译器PyCharm. PyCharm 是由 JetBrains 打造 ...
- Spring MVC使用ModelAndView进行重定向(转)
1.Servlet重定向forward与redirect: 使用servlet重定向有两种方式,一种是forward,另一种就是redirect.forward是服务器内部重定向,客户端并不知道服务器 ...
- PHP加密解密方法
加密解密方法 //字符串解密加密 function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) { $ckey_l ...