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 和 ...
随机推荐
- js登陆验证错误不刷新页面
验证函数返回 false;返回到onclickonclick 其实也是一个函数.. 所以需要加 return;
- log4j.properties的详细配置
log4j.properties的详细配置 log4j.properties的maven配置 <dependency> <groupId>org.scala-lang</ ...
- C# WinfForm 控件之dev报表 XtraReport (八)动态生成报表
功能说明:生成一个报表文件DV1,保存到本地AA.rep,再重新加载这个文件到DV2 1.布局如下图: panel1 上有三个button panel2上有个documentView dv1 pane ...
- Neo4j Cypher查询语言详解
Cypher介绍 "Cypher"是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询.Cypher还在继续发展和成熟,这也就意味着有可能会出现 ...
- javascript基础入门之js中的结构分支与循环语句
javascript基础入门之js中的结构分支与循环语句 程序的结构①顺序结构:自上而下:②选择(分支)结构:多条路径,根据不同的条件,只执行其中一个:③循环结构:重复某些代码④配合特定的语句实现选择 ...
- PHP算法之最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在唯一答案. 例如,给定数 ...
- nodejs的npm修改源
在国内用npm install时,速度总是不尽如人意,解决办法是修改npm的数据源 npm config set registry https://registry.npm.taobao.org 修改 ...
- Redis Desktop Manager可视化工具连接不上redis
1.在centos中启动redis之后,redis进程也是可查的,但是一连接可视化工具就报错: can't connect to redis-server 2.原因分析: ①首先redis是肯定已经开 ...
- 关于rem单位的使用
rem在移动端应用可参考淘宝的页面http://m.taobao.com (html的font-size通过动态计算获取) 页面基准320px(20px),html font-size值的计算: 注: ...
- hive的复合数据类型
hive中的复合数据类型 Array array中的数据为相同类型,例如,假如array A中元素['a','b','c'],则A[1]的值为'b' 数据结构如下: zhangsan beijing, ...