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. Facebook 在page添加自己开发的app

    最初接到的需求是,在facebook主页中嵌入一个类似这样领取游戏礼包的页面. 一开始连facebook开发者中心在哪里都不知道,在万能的搜索框里面找到static html之类的第三方应用,但是这样 ...

  2. PyCharm基本使用

    调节PyCharm的背景颜色 File>Settings>Appearance&Behavior>Appearance 在PyCharm中切换Python解释器版本 File ...

  3. [Q]pdfFactory打印机内存不能为read的问题

    运行环境:xp系统,AutoCAD2007 1. 使用pdfFactory打印文本文件没有问题. 2. 使用CAD打印的时候出现问题,使用CAD自带的PLOT命令打印也出现相同的问题. 3. 使用相同 ...

  4. 2、表单form

    只要使用input,就用form,使用方法是在所有的input之外加一个总的form双标签 切记给每个input都加name,提交表单时同时会提交name属性 input可以做的事:文本框.密码框.单 ...

  5. ps -ef |grep 输出的具体含义

    [root@localhost ~]# ps -ef | grep ApacheJetspeed root     18887 18828  0 08:09 pts/0    00:00:00 gre ...

  6. vscode: Visual Studio Code 常用快捷键

    vscode: Visual Studio Code 常用快捷键 主命令框 F1 或 Ctrl+Shift+P: 打开命令面板.在打开的输入框内,可以输入任何命令,例如: 按一下 Backspace ...

  7. MySQL千万级数据JDBC插入

    案例语句: String sql = "LOAD DATA LOCAL INFILE '" + dataFilepath + "' into table " + ...

  8. linux内存管理(repost)

    一 为什么需要使用虚拟内存 大家都知道,进程需要使用的代码和数据都放在内存中,比放在外存中要快很多.问题是内存空间太小了,不能满足进程的需求,而且现在都是多进程,情况更加糟糕.所以提出了虚拟内存,使得 ...

  9. 利用GCD实现单利模式的宏代码

    以下是.h文件,使用时,直接在需要实现单例模式的类中导入头文件即可. // .h文件 #define DenglSingletonH(name) + (instancetype)shared##nam ...

  10. When Hybrid Cloud Meets Flash Crowd: Towards Cost-Effective Service Provisioning--INFOCOM 2015

    [标题] [作者] [来源] [对本文评价] [why] 存在的问题 [how] [不足] assumption future work [相关方法或论文] [重点提示] [其它]