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. Python中is和==的区别的

    在python中,is检查两个对象是否是同一个对象,而==检查他们是否相等. str1 = 'yangshl' str2 = 'yang' + 'shl' print('str1 == str2:', ...

  2. 将stack翻译成"堆栈"实在是误人子弟

    也不知道从何时起,也不知道是哪个"教授"还是"老师",将stack翻译成堆栈(据说台湾叫做"堆叠").窃以为,这种翻译实在是误人子弟(题外话 ...

  3. vedio_note_1

    同步复位 always @ (posedge clk) ....... 异步复位 always @ (posedge clk or negedge rst_n) ....... 异步复位和同步复位的优 ...

  4. jquery验证表单是否满足正则表达式是否通过验证例子

    //验证通用函数 a表示元素对象,b表示正则表达式,c存bool值 function testyz(a,b,c){ c=false; $(a).on("blur",function ...

  5. 安装 zabbix 时遇到的一个问题

    安装 zabbix 2.0.3,到最后阶段,遇到一个问题: PHP bcmath extension missing,  php configuration parameter --enable-bc ...

  6. hdu 5207 BestCoder Round #38 ($) Greatest Greatest Common Divisor

    #include<stdio.h> #include<string.h> #include<math.h> ]; ]; int main() { int sb; s ...

  7. Python学习笔记——基础篇【第五周】——常用模块学习

    模块介绍 本节大纲: 模块介绍 time &datetime模块   (时间模块) random   (随机数模块) os   (系统交互模块) sys shutil   (文件拷贝模块) j ...

  8. ef code first 您没有所需权限

    在进行数据库更新操作时,update-database -force,反复提示没有改表或者没有所需权限,昨晚折腾了4个小时没有搞定,太晚了,今天Google了一下,这方面的错误,提到的都很少,在一篇文 ...

  9. bfs或者dfs Good Bye 2016 D

    http://codeforces.com/contest/750/problem/D 题目大意: 放鞭炮,鞭炮会爆炸n次,每次只会往目前前进方向的左上和右上放出他的子鞭炮.问,最后能有多少格子被覆盖 ...

  10. dll间接应用问题

    在项目prj引用一个dll,a.dll,时,此dll应用b.dll 此时不将b.dll引用添加到prj,会有问题