Java 算法
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 算法的更多相关文章
- JAVA算法系列 冒泡排序
java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...
- JAVA算法系列 快速排序
java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...
- java算法 蓝桥杯 乘法运算
问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...
- java算法 蓝桥杯 扶老奶奶街
一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...
- java算法 蓝桥杯 高精度加法
问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...
- java算法 蓝桥杯 格子位置
问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三 ...
- java算法----排序----(6)希尔排序(最小增量排序)
package log; public class Test4 { /** * java算法---希尔排序(最小增量排序) * * @param args */ public static void ...
- java算法----排序----(5)归并排序
package log; import java.util.Arrays; public class Test4 { /** * java算法---归并排序 * * @param args */ pu ...
- java算法----排序----(4)快速排序
package log; public class Test4 { /** * java算法---快速排序 * * @param args */ public static void main(Str ...
- java算法----排序----(3)冒泡排序
package log; public class Test4 { /** * java算法---冒泡排序 * * @param args */ public static void main(Str ...
随机推荐
- ios在项目中打开word文档、ppt等总结
最近在项目开发中遇到下载附件文档预览需求,在这里总结一下我的实现方法,本文最后会附带我写的demo下载地址 这里我总结了三种实现方法(1)用webView预览(2)通过UIDocumentIntera ...
- PHP 在 Nginx 下主动断开连接 Connection Close 与 ignore_user_abort 后台运行
这两天弄个PHP调用 SVN 同步 update 多台服务器更新的程序,为了避免 commit 的时候不会被阻塞卡半天得想个办法只请求触发,而不需要等待程序 update 完成返回结果这样耗时太长,所 ...
- 初级AD域渗透系列
net group /domain 获得所有域用户组列表 net group “domain admins” /domain 获得域管理员列表 net group “enterprise admi ...
- WinForm ListView
今天,我学习了公共控件中的ListView的内容. 首先,在利用ListView布置界面时,有以下三个方面: 1.视图: 在其右上方小箭头点击将视图改为Details:或者右键属 ...
- Flashbuilder 破解方式 4.6 +4.7(网络资源整理)
Fb4.6 破解方式 安装完成后在安装目录下依次修改下列3个文件: (1).eclipse\plugins\com.adobe.flexbuilder.project_4.6.0.328916\MET ...
- C#代码篇:代码产生一个csv文件调用有两个核心的坑
忙活了半天终于可以开工了,a物品到底要不要放进去取决于两个因素,第一是a有4kg重,只有背包大于等于4kg的时候才能装进去(也就是说当i=1,k<4时f[i,k]=0):第二是当背包的重量大于等 ...
- mac上搭建python+selenium2的环境
1.mac默认已安装有python和easy_install 2.进入终端,使用root的权限,然后输入,回车后需要root的密码,即可安装成功,成功结果如下所示 sudo easy_install ...
- 整理了一份React-Native学习指南
原文: http://www.w3ctech.com/topic/909 自己在学习React-Native过程中整理的一份学习指南,包含 教程.开源app和资源网站等,还在不断更新中.欢迎pull ...
- Java 笔试面试 基础篇 一
1. Java 基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法, 线程的语法,集合的语法,io 的语法,虚拟机方面的语法. 1.一个".java& ...
- XML的xPath格式
XML的xPath格式(C#) xPath是XML提供的一种格式,用来查询XML的节点. <?xml version="1.0" encoding="ISO-885 ...