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源码解析:21sentinel(二)定期发送消息、检测主观下线
六:定时发送消息 哨兵每隔一段时间,会向其所监控的所有实例发送一些命令,用于获取这些实例的状态.这些命令包括:"PING"."INFO"和"PUBLI ...
- Hdu 4965(矩阵快速幂)
题目链接 Fast Matrix Calculation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K ...
- 如何获取Expression Design 4工具与Expression Blend 4工具
在VS2010+C#+WPF 开发项目过程中涉及到界面的布局与设计,网上有人讲采用Expression Design 4与Expression Blend 4工具相当方便, 于是决定试看看,下面将这个 ...
- 使用Jedis操作Redis-使用Java语言在客户端操作---List类型
在Redis中,List类型是按照插入顺序排序的字符串链表.和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素.在插入时,如果该键并不存在,Redis将为该键创建 ...
- mysql hibernate 查询ip地址在mysql的网段
买的数据库,地址是字符串格式 如何查询一个确定的ip在哪里呢? 直接通过字符串查询估计要慢死了 可以先把自己的要查询的ip转换为数字,然后再去以数字的方式查询 IP转数字1.2.6.0转为数字 SEL ...
- Linux图形界面安装卸载,与命令界面之间的转换
1.图形界面与命令界面之间的转换 软切换: ctrl+alt+F6进入命令行模式,ctrl+alt+F1进入图形界面,(有些情况下不管用) 注意: 该方法转为命令行界面后图形界面依然占据着系统资源. ...
- python实例 列表
#! /usr/bin/python # -*- coding: utf8 -*- #列表类似Javascript的数组,方便易用 #定义元组 word=['a','b','c','d','e','f ...
- vue-eslint配置文件
做项目的时候,我把eslint设置为了false,可想而知提交会产生的冲突 让我一个一个解决肯定不可能的,eslint的rule很多 在vue的配置文件.eslintrc.js中配置以下选项 这样只需 ...
- 大咖手把手教您,DLA一键建仓!
DLA很早之前就支持了对关系型数据库的查询,但是一直以来用户会有一个担心: 直接分析RDS里面的数据会不会影响线上业务. 这个担心很合理,除非你要查询的RDS是专门用来做后台数据分析使用的,否则直接大 ...
- 关于background-image调整大小和位置的方法笔记
遇到background-image的问题有点多,直接上网搜资料自己整理一下 <!DOCTYPE html> <html lang="en"> <he ...