JAVA算法之简单排序
冒泡排序:
在概念上是排序算法中最简单的,但是运行起来非常慢,冒泡排序遵循以下几个规则(假如我们现在要给一队打乱的足球队员排序):
- 比较两个队员
- 如果左边的队员比右边的高,则交换位置
- 向右移动一位,比较下面两个队员
接下来给出冒泡排序的JAVA代码
public Integer[] bubbleSort(Integer[] a){
int out,in;
for(out = a.length-1;out > 0;out--){//外层每循环一次排出一个最大值
for(in = 0;int < out;in++){
if(a[in]>a[in+1]){ //比较相邻元素大小,左边的大则交换位置
long temp = a[in];
a[in] = a[in+1];
a[in+1] = temp;
}
}
}
return a;
}
冒泡排序的效率:
在冒泡排序中若有N个数据项,则第一趟排序中需要N-1次比较,第二趟中有N-2次比较,类推下来我们可以得到比较次数的求和公式N*(N-1)/2这样我们忽略-1可得我们的冒泡算法大概做了N2/2次比较,假设数据是随机的,则需要进行交换的次数平均下来是N2/4次。交换和比较的操作次数都和N2成正比,在大O表示法中,冒泡排序运行需要O(N2)的时间级别,在任何时候只要看到一个循环嵌套在另外一个循环中我们都可以怀疑他的运行时间为O(N2)级别;
选择排序:
选择排序改进了冒泡排序,将必要的交换次数从O(N2)减少到了O(N)但是比较次数仍然是O(N2),选择排序算法,假如对一队足球队员进行排序,从队列的最左端开始记录队员的身高,和后面的队员挨个比较,若遇到身高比他矮的,则记录换成更矮的人的身高,最后这一趟排序就能找到最矮的队员,然后最后再和第一个队员进行交换位置;这期间做了N-1次比较,只做了一次交换;下面给出排序的java代码
public Integer[] selectionSort(Integer[] a){
int out, in, min;
for (out = 0; out < a.length-1; out++) {
min = out; //记录最小元素的索引
for (in = out + 1; in < a.length; in++) {
if (a[min] > a[in]) { //依次比较记录较小元素的索引
min = in;
}
}
//上面循环结束得到此外层循环的最小元素,进行交换
int temp = a[min];
a[min] = a[out];
a[out] = temp;
}
return a;
}
选择排序的效率:
选择排序和冒泡排序执行了相同的比较次数N*(N-1)/2。当N值很大的时候,比较的次数是主要的,所以选择排序运行的时间用大O法表示为O(N2),虽然大O表示复杂度和冒泡一样,但是选择排序无疑是更快的,因为进行的交换要少很多,当N值较小时,特别是交换时间比比较时间大得多的时候,选择排序无疑是相当快的。
插入排序:
大多情况下插入排序是基本排序算法中最好的一种,虽然用大O表示时间复杂度仍然为O(N2),但是一般情况下比冒泡排序快一倍,比选择排序还要快一点。经常用在比较复杂的排序的最后阶段,比如快速排序。
插入排序算法即从队列最左边开始,将后面的每个人一个个地插入到队列的相应的位置,

上图可以很好地表示排序算法的排序过程,对于上图的理解,假如我们从排序算法的中间开始,在被标记的队员左边已经排好序了,此时让已标记的队员出列,然后依次同左边的队员比较,将比标记队员高的依次向右移,最后找到需要插入的位置,插入标记的队员,下面给出插入排序java代码
public Integer[] insertionSort(Integer[] a){
int out, in;
for (out = 1; out < a.length; out++) {
int temp = a[out];
in = out;
while (in > 0 && a[in - 1] >= temp) {
a[in] = a[in - 1]; //每个比当前标记的大的元素一次向数组后移一位
--in;
}
//当上面的循环结束时,此时in的位置就刚好停在比当前标记元素大的前面一个位置
//此时位置经过循环之后所有比标记元素大的都向后移动过了,因此此时可以向当前位置插入元素
a[in] = temp;
}
return a;
}
JAVA算法之简单排序的更多相关文章
- 【Java数据结构与算法】简单排序、二分查找和异或运算
简单排序 选择排序 概念 首先,找到数组中最小的那个元素,其次,把它和数组的第一个元素交换位置(如果第一个元素就是最小的元素那么它就和自己交换).再次,在剩下的元素中找到最小的元素,将它与数组的第二个 ...
- JAVA算法之高级排序
本章介绍两种高级排序,希尔排序和快速排序,这两种排序比之前讲到的简单排序都要快很多:希尔排序大约需要O(N*(logN)2)的时间,快速排序的时间复杂度为(N*logN),这两种算法和我们在讲递归的时 ...
- Java学习笔记——排序算法之简单排序
男儿何不带吴钩,收取关山五十州.请君暂上凌烟阁,若个书生万户侯? --南园十三首 三种排序法: 1.冒泡法 2.简单选择法 3.直接插入法 上代码: 1.冒泡排序 public class Bub ...
- Java实现三大简单排序算法
一.选择排序 public static void main(String[] args) { int[] nums = {1,2,8,4,6,7,3,6,4,9}; for (int i=0; i& ...
- Java算法简介及排序剖析
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 从小白晋升,一路走来:从helloworld,到JFrame,再到Android:从城外小子,到内城 ...
- Java数据结构系列——简单排序:泡、选择、直接进入
package SimpleSort; public class SimpleSort { /** * 冒泡排序:每次循环过程中.小的排在后面的数会像水中的 * 气泡一样慢慢往上冒,所以命名为冒泡排序 ...
- [Java算法] -- 1. 常用排序之冒泡排序和选择排序
使用Java语言实现冒泡排序和选择排序 推荐一个数据结构可视化的网站:http://zh.visualgo.net/zh (暂时访问不了) 对排序不太熟悉的朋友,建议去上面的网站学习一下,你将会发现一 ...
- JAVA算法系列 冒泡排序
java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...
- JAVA算法系列 快速排序
java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...
随机推荐
- Spring MVC源码分析(三):SpringMVC的HandlerMapping和HandlerAdapter的体系结构设计与实现
概述在我的上一篇文章:Spring源码分析(三):DispatcherServlet的设计与实现中提到,DispatcherServlet在接收到客户端请求时,会遍历DispatcherServlet ...
- Logic回归总结
转自http://blog.csdn.net/dongtingzhizi/article/details/15962797 当我第一遍看完台大的机器学习的视频的时候,我以为我理解了逻辑回归,可后来越看 ...
- 行动带来力量,周三(5月7日)晚IT讲座通知
讲座简单介绍 ITAEM团队负责人骆宏等和大家周三晚8点(5月7日)相约钟海楼03035.和大家分享团队成员的"编程入门之路",在这里,同龄人(大三)以学生的角度.和大家分 ...
- man bash
BASH(1) General Commands Manual BASH(1) NAME bash - GNU Bourne-Again SHell SYNOPSIS bash [options] [ ...
- python--面向对象:类和对象命名空间
一.一个类可以定义两种属性:静态属性和动态属性 (一)对于不可变数据类型来说,类变量最好用类名操作,也可以用对象操作,但是只能查,不能改,对象改的都只是相当于在自己的命名空间里重新建立了一个 clas ...
- 《代码大全2》读书笔记 Week4
<代码大全2>第8章:防御式编程 防御式编程的主要思想是子程序应该不因为非法的输入值被破坏,就好比开车时的防御式驾驶:你无法预估其他司机将会做什么,但你要采取措施保证当他人做出危险动作时自 ...
- 2019-5-16-WPF-光标初始化的时候-temp-文件夹满了无法创建
title author date CreateTime categories WPF 光标初始化的时候 temp 文件夹满了无法创建 lindexi 2019-05-16 19:16:27 +080 ...
- day02 mysql基本语句 存储引擎 数据类型 完整性约束
day02 mysql 一.sql的基本语句 系统数据库 information_schema: 虚拟库, 不占磁盘空间(在内存汇中): 存的是数据库启动后的一些参数, 如 ...
- PHP - 实现 strStr()
实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返 ...
- Python 3.3 IDLE 删除键出现空格卡顿
Python 3.3 IDLE 删除文字时会出现"□",造成删除键卡顿 原因:使用的是百度输入法,由于输入法的编码方式不同,对IDLE造成了不兼容 换成了搜狗输入法问题解决.... ...