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. Salesforce自主学习(一)

    Salesforce学习--接触Apex: 学习目标: 1.描述出Apex程序语言的关键特点: 2.保存一个Apex类并用另一个Apex类来调用它的方法: 3.使用Developer Console检 ...

  2. C# asp.net PhoneGap html5

    很久没写博客,今天自己写一篇吧.来谈一谈c# PhoneGap,html5 与asp.net.能搜到这篇博客就说明你是一位.net开发者,即将或者正在从事移动开发. 大家可能都有疑,我是一名.net开 ...

  3. Beego学习笔记——开始

    beego简介 beego是一个快速开发Go应用的http框架,他可以用来快速开发API.Web.后端服务等各种应用,是一个RESTFul的框架,主要设计灵感来源于tornado.sinatra.fl ...

  4. python json.load 的奇葩错误

    json.load() 可以参数是文件对象, 但是这种方式会遇到莫名其妙的错误: No JSON object could be decoded 有的朋友说的是utf-8编码有BOM和无BOM造成的. ...

  5. C#里面Auotpostback回刷时候,textbox里面的password怎么保存

    刷新页面时,如何保留页面上的PassWord模式下的TextBox的值? this.txtUserPwd.Attributes["value"] = txtUserPwd.Text ...

  6. Dubbo服务的搭建与使用

    官方地址Dubbo.io Dubbo 主要功能 高并发的负载均衡,多系统的兼容合并(理解不深,不瞎掰了) Dubbo 主要组成有四部分 Zookeeper(服务注册中心) Consumer(服务消费方 ...

  7. joda-time的一个DEMO

    Date activeDate = person.getActiveTime(); if(activeDate==null){ modelMap.put("expireDate", ...

  8. ViewCompat.animate(view) 动画的操作

    ViewCompat.animate(view) 实现动画的操作,动画兼容包; ViewCompat.animate(view) 实现动画的操作 .setDuration(200) .scaleX(0 ...

  9. <密码的实现>输入密码的时候,显示“*”,而不是显示输入内容

    一开始还以为用C语言和C++不能实现输入密码的时候显示出“*”而不显示输入的内容呢!没想到偶然的机会试出了用while循环结构可以实现.以下是我整理的C语言和C++的代码,供初学者参考. 这是C语言实 ...

  10. 第九章 观察者模式 OBSERVER

    当对象发生改变时,应该使客户得到通知,然后,让客户查询对象的新状态. 其目的是在对象之间(目标对象和客户对象),定义了一个一对多的依赖关系,从而一个对象状态发生改变时,所有依赖这个对象的对象都能得到通 ...