排序的算法是很多公司的笔试和面试题,个人感觉Java中其实无需使用这些排序方法,因为Java中已经为我们提供了很方便效率很高的sort()方法。但是不使用不能代表不需要学习这些算法,也不是仅仅为了面试和笔试才去学这些算法,这些算法中有很好的数据结构方面的思想,掌握这些算法可以帮助我们更好的理解数据结构。这次既然是回顾和思考,我决定使用很形象的图文展示的方式,透彻的去理解每一个排序算法。

一、选择排序

原理:第n轮比较将数组中除过自己的所有元素与第n个元素比较,如果大于(小于)第一个元素则交换。

有的朋友容易忘记这些排序算法或者说容易混淆这几种排序算法,在这里我建议大家从算法的名字上去记忆,比如说:“选择排序”可以这样去理解,我要从这一堆数组元素中选择出最大、最小(确定的东西,绝对的概念)元素,每次去选择剩下的元素中最大或者最小的元素,依次循环就能排序。

下面我们用Java代码来实现:

	public static int[] selectionSort(int[] arry){
/*
* 对照上面的图
* 1、因为最后一个元素就是剩下的,因此不需要去找了,所以总共比较lengh-1轮
* 2、第n轮的第一次比较是数组下标n-1的元素和数组下标为n的元素比较。
* 比如第1轮第一次比较是数组下标为0的元素和数组下标为0+1的元素比较。
*/
for(int i=0; i<arry.length-1; i++){
for(int j=i+1; j<arry.length; j++){
//如果小于本轮第一个元素
if(arry[i] > arry[j]){
//交换两个元素
int temp = arry[i];
arry[i] = arry[j];
arry[j] = temp;
}
}
}
return arry;
}

二、冒泡排序

原理:每一轮都去比较相邻的元素将小(大)的放到前面

下面我们用Java代码实现

	/**
* 冒泡排序:请对照上图
* @param arry
* @return
*/
public static int[] bubbleSort(int[] arry){
/*
* 冒泡排序也比较length-1轮
* 与选择排序不同的是每次都从第一个元素开始
*/
for(int i=0; i<arry.length - 1; i++){
for(int j=0; j<arry.length - i - 1; j++){
if(arry[j] > arry[j + 1]){
int temp = arry[j];
arry[j] = arry[j+1];
arry[j+1] = temp;
}
}
}
return arry;
}

三、插入排序

插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。 插入排序方法分直接插入排序和折半插入排序两种。

这里仅研究一下直接插入排序

原理:遍历到第N个元素的时候前面的N-1个元素已经是排序好的了,那么就查找前面的N-1个元素把这第N个元素放在合适的位置,如此下去直到遍历完序列的元素为止.

用Java实现排序如下:

	/**
* 直接插入排序
* @param arry
* @return
*/
public static int[] insertSort1(int[] arry){
/*
* 第一个元素不用排序了,所以从下标为1开始
*/
for(int i=1; i<arry.length;i++){
//和比他下标小的所有元素比较,所以是j<i
for(int j=0; j<i; j++){
if(arry[i] < arry[j]){
int temp = arry[i];
arry[i] = arry[j];
arry[j] = temp;
}
}
}
return arry;
}

我们发现上面的代码还能优化,比如第四个元素和前面三个比较,本应该插入到第二个位置,插入后还要与原来的第二个和第三个元素比较。很快我们就将代码修改如下:

	/**
* 直接插入排序
* @param arry
* @return
*/
public static int[] insertSort1(int[] arry){
int i, j, t;
/*
* 第一个元素不用排序了,所以从下标为1开始
*/
for(i=1; i<arry.length;i++){
t = arry[i];
/*
* 我们从后面往前面比较有两张情况
* 1、如果比较的结果是当前数小于前面(已经排序)的最后一个元素
* 说明需要将最后一个元素前移一位,然后将该元素放入到这个位置
* 2、如果比较的结果是当前数大于前面(已经排序)的最后一个元素
* 这样就直接将该元素放入到j位置即可。
*/
for(j=i-1; j>=0; j--){
if(t < arry[j]){
//将arry[j]元素放置到向后1位的位置上
arry[j+1] = arry[j];
}else{
break;
}
}
//因为上面代码执行后会执行一次j--,所以要j+1
arry[j+1] = t;
}
return arry;
}

还有一种和上面的算法相同的简单写法(经典写法),如下:

	/**
* 直接插入排序(经典写法)
* @param arry
* @return
*/
public static int[] insertSort2(int[] arry){
int i, j, t;
for(i=1; i<arry.length;i++){
t = arry[i];
for(j=i-1; j>=0 && t<arry[j]; j--){
arry[j+1] = arry[j];
}
arry[j+1] = t;
}
return arry;
}

JAVA SE回顾及思考(3)——排序算法的更多相关文章

  1. JAVA SE回顾及思考(1)——面向对象的特点

    学习Java已经三年了,现在开始做Android开发,虽说还在用Java语言但本人现在才真真的意识到无论学什么基础才是最重要的,可能一些刚接触Java或者Android的朋友现在还体会不到基础的重要性 ...

  2. JAVA SE回顾及思考(2)——数组的复制与动态扩展

    我们知道在Java中数组是非基本类型既数组是对象(Object)的子类,所以用下面的这种方式是不能复制该对象的 public static void main(String[] args) { int ...

  3. java讲讲几种常见的排序算法(二)

    java讲讲几种常见的排序算法(二) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 堆排序 思路:构建一个小顶堆,小顶堆就是棵二叉树,他的左右孩子均大于他的根节点( ...

  4. java讲讲几种常见的排序算法

    java讲讲几种常见的排序算法(一) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 以数组array={6,3,20,8,15,1}为例 冒泡排序 思路:从第0个到 ...

  5. 我们一起来排序——使用Java语言优雅地实现常用排序算法

    破阵子·春景 燕子来时新社,梨花落后清明. 池上碧苔三四点,叶底黄鹂一两声.日长飞絮轻. 巧笑同桌伙伴,上学径里逢迎. 疑怪昨宵春梦好,元是今朝Offer拿.笑从双脸生. 排序算法--最基础的算法,互 ...

  6. Java面试宝典系列之基础排序算法

    本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排 ...

  7. [转]Java学习---7大经典的排序算法总结实现

    [原文]https://www.toutiao.com/i6591634652274885128/ 常见排序算法总结与实现 本文使用Java实现这几种排序. 以下是对排序算法总体的介绍. 冒泡排序 比 ...

  8. 用 Java 实现的八种常用排序算法

    八种排序算法可以按照如图分类 交换排序 所谓交换,就是序列中任意两个元素进行比较,根据比较结果来交换各自在序列中的位置,以此达到排序的目的. 1. 冒泡排序 冒泡排序是一种简单的交换排序算法,以升序排 ...

  9. Java 实现的各种经典的排序算法小Demo

    由于有上机作业,所以就对数据结构中常用的各种排序算法都写了个Demo,有如下几个: 直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 选择排序 桶排序 Demo下载地址 下面谈一谈我对这几个排 ...

随机推荐

  1. 异步FIFO设计

    参考http://www.cnblogs.com/BitArt/archive/2013/04/10/3010073.html http://blog.sina.com.cn/s/blog_6d30f ...

  2. springMVC easyUI filebox 单个文件上传

    被这个文件上传坑到如今.还是自己技术问题,照着之前extjs项目那边的上传实例,愣是上传不了 到后面就查了下springMVC的文件上传,依照那样搞定了http://blog.csdn.net/jad ...

  3. 如何获取用户的地理位置-浏览器地理位置(Geolocation)API 简介

    如何获取用户的地理位置-浏览器地理位置(Geolocation)API 简介 一.总结 一句话总结:Geolocation API(地理位置应用程序接口)提供了一个可以准确知道浏览器用户当前位置的方法 ...

  4. amazeui页面分析5

    amazeui页面分析5 一.总结 1.把原模板当成样例集合就好 2.都是一块一块的,删改等操作都方便 3.list方面的操作很多都是ui配合li 4.其实容器本质还是div,所以真的算简单了 5.样 ...

  5. iOS_03_为什么选择ios开发

    为什么选择ios开发 为什么要选择移动开发 * 手机将是人类最离不开的设备之一,硬件软件参数也越来越强,应用需求量剧增. * 移动互联(就是将移动通信和互联网二者结合起来)发展迅速,各大公司都对移动互 ...

  6. 使用Perl合并文件

    使用Perl合并文件 有时需要将整个目录下的小文件合并到一个文件中,以便查阅检索 特性 整个目录完全遍历,自动存入单个文件 顺序遍历文件 待合并的目录 合并后的文件内容 syscfg/test1 sy ...

  7. 12.1、USB驱动——描述符、URB、管道

    大家常说,一个设备通常有多个配置,配置通常有多个接口,接口通常有多个端点.接口代表逻辑上的设备,比如声卡分为 录音和播放.访问设备时,访问的是某个接口(逻辑设备).除了端点0之外,每个端点只支持一个传 ...

  8. PatentTips - Data Plane Packet Processing Tool Chain

    BACKGROUND The present disclosure relates generally to systems and methods for providing a data plan ...

  9. php 删除数组指定元素,下标还不乱

    $arr是目标数组 $offset是要删除的元素的key 1是指删除的长度 array_splice($arr, $offset, 1); 之前用的unset,但是比如删除的是第三个,那么下标的2就会 ...

  10. Visual Studio 项目目录下的bin目录和 obj目录

    一.Bin目录 Visual Studio 编译时,在bin 目录下有debug 和 release 目录. 1.Debug: 通常称为调试版本,它包含调试信息,所以要比Release 版本大很多(可 ...