1、简单的冒泡排序

         //冒泡算法一共两种
// -----冒泡算法(1)
int a[]={23,69,4,58,1,20};
for (int i = 0; i < a.length-1; i++) {
for (int j = i+1; j < a.length; j++) {
if(a[i]>a[j]){
a[i]=a[i]+a[j];
a[j]=a[i]-a[j];
a[i]=a[i]-a[j];
}
}
}
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
// -----冒泡算法(2)
int b[]={23,69,4,58,1,20};
for (int i = 0; i < b.length-1; i++) {
for (int j = b.length-1; j>i; j--) {
if(a[j-1]>a[j]){
a[j]=a[j]+a[j-1];
a[j-1]=a[j]-a[j-1];
a[j]=a[j]-a[j-1];
}
}
}
System.out.println("-----------2----------");
for (int i = 0; i < b.length; i++) {
System.out.println(a[i]);
}

2、对冒泡算法的小小优化

             //冒泡算法的改进
//利用flag来,主要是解决如果出现排序交换多次后出现排序好后,无需再进行检测排序
int c[]={23,69,4,58,1,20};
boolean flag=true;
for (int i = 0; (i < (c.length-1)) && flag; i++) {
flag=false;
for (int j = c.length-1; j>i ; j--) {
if(c[j-1]>c[j]){
c[j]=c[j]+c[j-1];
c[j-1]=c[j]-c[j-1];
c[j]=c[j]-c[j-1];
flag=true;
}
}
} for (int i = 0; i < c.length; i++) {
System.out.println(c[i]);
}

3、选择排序算法,算是比较好的算法了,主要是减少交换次数

思想: 一开始先把数组中最小数值的下标找出来,如果这个下标不是第一个数的下标,才在最后交换,不然不交换

     下一次就是从第二个位置到最后一个位置的数组中进行选择最小值,之后记录下来,如果不是第二个数,才交换,不然不交换

   以此类推!

 //-----选择排序-----算是比较好的算法
int d[]={23,69,4,58,1,20};
int min;
for (int i = 0; i < d.length-1; i++) {
min=i;
for (int j = i+1; j < d.length; j++) {
if(d[min]>d[j]){
min=j;
}
}
if(min!=i){
d[min]=d[min]+d[i];
d[i]=d[min]-d[i];
d[min]=d[min]-d[i];
}
} for (int i = 0; i < d.length; i++) {
System.out.println(d[i]);
}

4、插入排序算法

插入排序算法是较冒泡排序选择排序性能要更好的排序算法

插入排序的主要思想:将一组无序数分成两个区,一个为有序区,另一个为无序区。从无序区中每次抽取一个数插入到有序中合适的位置。直至所有数全部有序

演示:(从小到大)

原始数列: 5 2 4 8 6

将数列分为有序区和无序区: 5 为有序区(红色), 2 4 8 6 为无序区(绿色)

 5 2 4 8 6

开始:

每一次都由无序区中从左至右逐个抽取并放置到有序区的合适位置

首先抽取2

第一次插入结果为: 2 5 4 8 6  (2由于比5小,当然插入到其前面的位置上)

继续抽取4

第二次插入结果为:2  5 8 6    (4比5小,但比2大,就插入到其两者之间)

继续抽取8

第三次插入结果为:2 4 5  6    (8比5大,所以不用移动,从这里可以看出,无序区的数插入有序中的比较条件就是与有序区最尾的数进行比较即可)

继续抽取6

第四次插入结果为:2 4 5  8   (到这里,整个数列已经是一个有序的数列)

注意:插入数据的时候,位于插入数据右侧的数都需要向后移动一位,因为这样才能有位置进行插入。属于这种情况的数列是存储在一段连续的内存空间(例如数组)。但如果不是一段连续的内存空间(例如链表)就会简单和高效些。

按照这种排序思路,可以明显看出这个排序的好处就是增量排序

什么是增量排序?其实很简单:向一个已有序的数列中添加元素,并且要保证添加元素后的数列仍保持其原来的有序性

可见,这种插入排序算法在添加元素的时候,最多只需要遍历一次即可。即O(n) 注意:这个不是最坏情况和平均情况的时间复杂度

插入排序最坏情况平均情况的时间复杂度都是:O(n²)

 /*
* 插入排序算法,使用场景,在于如果数列中有一部分已经排好序的
* 那么所用时间就会减少很多,如果数列有元素打散得很厉害,
* 那么建议使用 选择排序 , 减少交换次数!
*/
int [] f ={2,4,22,33,5,45,23};//我设置比较打散! for (int i = 1; i < f.length; i++) {
for (int j = i; j>0 ; j--) {//这样做是从后往前进行比较和交换,所以对于比较打散的数组排序不利!
if(f[j-1]>f[j]){//从小到大排序
//交换
f[j]=f[j]+f[j-1];
f[j-1]=f[j]-f[j-1];
f[j]=f[j]-f[j-1];
}else{
//这个数是比有序数列中最大的大的话,就不用交换了!节省时间就在这里,这也是为何对于比较打散的数组排序不利!
break;
}
}
}

Java 算法的更多相关文章

  1. JAVA算法系列 冒泡排序

    java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...

  2. JAVA算法系列 快速排序

    java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...

  3. java算法 蓝桥杯 乘法运算

    问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...

  4. java算法 蓝桥杯 扶老奶奶街

    一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...

  5. java算法 蓝桥杯 高精度加法

    问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...

  6. java算法 蓝桥杯 格子位置

    问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三 ...

  7. java算法----排序----(6)希尔排序(最小增量排序)

    package log; public class Test4 { /** * java算法---希尔排序(最小增量排序) * * @param args */ public static void ...

  8. java算法----排序----(5)归并排序

    package log; import java.util.Arrays; public class Test4 { /** * java算法---归并排序 * * @param args */ pu ...

  9. java算法----排序----(4)快速排序

    package log; public class Test4 { /** * java算法---快速排序 * * @param args */ public static void main(Str ...

  10. java算法----排序----(3)冒泡排序

    package log; public class Test4 { /** * java算法---冒泡排序 * * @param args */ public static void main(Str ...

随机推荐

  1. maven项目如何引用本地的jar包

    下载该jar包到本地(如下载目录结构为:D:\Users\lu.wang\Downloads\searchservice\searchservice\jar\ttd.search.searchserv ...

  2. char、varchar、varchar(2)的区别

    char是存储字节是一定的,例如char(10),存储内容为"java",那么实际存储的是"java      ",后面是6个空字符.按字节存储: varcha ...

  3. CSS3之3D效果中的transform运用

    css3中添加了很多新的标签 属性 描述 css transform 向元素应用 2D 或 3D 转换. 3 transform-origin 允许你改变被转换元素的位置. 3 transform-s ...

  4. PHP的ip2long和long2ip函数的实现原理

    最近要做个十进制数字的可逆转换做邀请码,一直没搞清楚怎么弄的,实在太复杂了,今天弄IP时想到这个可以进行转换,于是研究了下原理: 主要是自己整理了下: $ip = '12.34.56.78'; $ip ...

  5. XTU 1245 Hamiltonian Path

    $2016$长城信息杯中国大学生程序设计竞赛中南邀请赛$C$题 简单题. 注意题目中给出的数据范围:$1 \le ai < bi \le n$,说明这是一个有向无环图,并且哈密顿路一定是$1 \ ...

  6. Jersey+Spring+Maven环境搭建

    第一步:创建一个Maven工程.加入Jersey.Spring.Jersey+Spring的依赖包,以及内嵌的Tomcat7插件: pom.xml文件如图所示: <project xmlns=& ...

  7. iOS UIImageView自适应图片大小

    窗口大小获取: CGRect screenBounds = [ [UIScreenmainScreen]bounds];//返回的是带有状态栏的Rect CGRect rect = [ [UIScre ...

  8. old linkedin profile

    employments: software engineer intern: Karl Storz Imaging, 2015-06 to 2015-09. software engineer int ...

  9. New Year Tree 【DFS序+先段数区间查询修改+二进制保存状态】

    题目链接[http://codeforces.com/problemset/problem/620/E] 题意:给出n个数,每个数有一个初始的颜色.由这n个数组成一颗树.有两种操作1.将以节点u为根的 ...

  10. Python基础篇-day8

    本节目录1.抽象接口2.静态方法.类方法.属性方法3.类的特殊方法 3.1 __doc__ 表示类的描述信息(注释) 3.2 __module__ 和 __class__ 3.3 __init__ 构 ...