初学者学Java(十五)
再谈数组
在这一篇中我们来讲一下关于数组的排序和查找的方法。
排序
说到数组的排序,就不得不说冒泡这种经典的方法。
1.冒泡排序
冒泡排序的基本思想是比较两个相邻元素的值,如果满足条件就交换元素的值(如果是升序,就将较大的值放在索引大的引用内,较小的值放在索引小的引用内;降序的话反之),这样一次循环后最大或最小的值就会转移到数组的最后的位置,经过多次循环后数组就会按要求排好。
具体算法如下(以升序为例):
publicstaticvoid swap(int[] array)
{
boolean a = false;
for(int i = 0 ; i <array.length-1;i++)
{
for(int j= 0 ;j<array.length - i-1;j++)
{
if(array[j]>array[j+1])
{
int t= array[j];
array[j]= array[j+1];
array[j+1]= t;
a =true;
}
}
if(!a)
{
return;
}
}
}
在这个方法中我们一共用了两层循环,内层循环是用来使最大的一个数移到数组的最后的位置,第二次把大二大的数移到数组倒数第二的位置,第一次循环是用来决定第二层循环一共需要循环多少次,外层循环每循环一次,内层循环就会少个需要比较的元素,这个元素就是我们上一次内层循环放到后面的数组元素值。
在这个方法中我还定义了一个布尔类型的变量,主要是用来提高程序的效率,如果某次内层循环一次交换也没有,说明当前数组的顺序已经满足要求了,没有必要进行后面的循环了,跳出即可。
冒泡排序我们就将这么多,我们来介绍另一种排序方式。
2.交换排序
这种排序是将每一个元素都与第一个元素进行比较,只要比第一个元素小就交换,最后就会将最小的元素放到第一个位置。在将后面的元素与第二个元素进行比较交换,同理第二小的元素就会放到第二个位置。以此类推,将数组元素顺序排好。具体算法如下(以升序为例):
publicstaticvoidswapOne(int[] array)
{
for(int i= 0 ; i <array.length-1;i++)
{
for(int j = i+1 ;j<array.length;j++)
{
if(array[i]>array[j])
{
int t = array[j];
array[j] = array[i];
array[i] = t;
}
}
}
}
在这种方法中也是用到了两层循环,内层循环是将要比较的元素与后面的元素依次进行比较,不符合条件就交换,实现最小的或最大的放到最前面。外层循环的次数是和数组元素的个数减一一样,因为有几个元素就需要把几个元素减一放到前面。这个描述起来可能不太好理解,大家可以根据程序来理解一下。
3.选择排序
选择排序的思想是将所有的数先就行比较,但不进行交换,只是将最大的进行标记,比较完后,将被标记的元素放到最后,然后进行下一次寻找,最后将数组元素的顺序排好。具体算法如下(以升序为例):
publicstaticvoidswapTwo(int[] array)
{
int k ;
for(int i = 0;i<array.length;i++)
{
k =0;
for(int j= 0; j<array.length-i;j++)
{
if(array[j]>array[k])
{
k =j;
}
}
int t= array[array.length - i-1];
array[array.length - i-1] = array[k];
array[k]= t;
}
}
这个方法的思路还是比较清晰的,需要注意的是用来标记的变量需要在每次外循环开始的时候清零,别的我就不多说了,下面来说说查找。
查找
最简单的查找一个数组中是否有某个元素的方法就是一个一个元素的与目标值进行比较,实现方法非常的简单,而且会大量浪费程序运行的时间,所以我们并不推荐使用。下面我来讲一下我们最常用的查找方法:二分法。
二分法
要想使用二分法是有一个前提条件的,就是数组必须是有序的。这与他的实现思路有关,他是这样实现的,先讲数组的最中间的元素的值与目标值进行比较,相等返回索引,大于目标值就将前半段的中间元素的值与目标元素进行比较,大、小于目标值就将后半段的中间元素的值与目标元素进行比较。以此类推,如果直到最后都没有,则就是没有找到目标值。具体算法如下:
publicstaticintcompare(int[] array,int i)
{
int low = 0;
int high = array.length;
int j = (low+high)/2;
while(low<=high)
{
if(array[j]== i)
{
return j;
}
else if(array[j]>i)
{
high = j-1;
j = (high+low)/2;
}
else
{
low = j+1;
j = (high + low)/2;
}
}
return -1;
}
在这个方法中变量low表示是还未进行比较的部分的最小的索引值,同理high表示最大的索引值,每一次循环都会改变low或high的值来进行下一次比较,直到找到该元素,或low>high。这个方法还是比较好理解的,我就说这么多吧。
初学者学Java(十五)的更多相关文章
- 没有基础的初学者学java怎样快速入门?超全的学习路线图
现在地球人都知道互联网行业工资高,上万都是小case,不值一提.可是对于大部分人来说,工资七八千都算很难了.那我也想学java,当程序员,赚大钱.可是作为一个初学者,怎样才可以快速入门呢?早点入门就可 ...
- java十五个常用类学习及方法举例
<code class="language-java">import java.util.Scanner; import java.util.Properties; i ...
- 初学者学Java常遇到的问题,我都给你回答了!
前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 春节在家刷知乎,看到了一个知乎的问题:<学 ...
- 零基础学Java第五节(面向对象一)
本篇文章是<零基础学Java>专栏的第五篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] 类与对象 在哲学体系中,可以分为主 ...
- Java从零开始学四十五(Socket编程基础)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...
- Java从零开始学三十五(JAVA IO- 字节流)
一.字节流 FileOutputStream是OutputStream 的直接子类 FileInputStream也是InputStream的直接子类 二.文本文件的读写 2.1.字节输入流 Test ...
- Java从零开始学二十五(枚举定义和简单使用)
一.枚举 枚举是指由一组固定的常量组成的类型,表示特定的数据集合,只是在这个数据集合定义时,所有可能的值都是已知的. 枚举常量的名称建议大写. 枚举常量就是枚举的静态字段,枚举常量之间使用逗号隔开. ...
- 学JAVA第五天,今天困得要死
好不容易坚持到第五天了,继续继续!!! 今天老师没有讲JAVA的for循环,倒是讲了HTML的相关内容: 讲了JAVA代码怎么在HTML中运行. 只要在HTML加入这个 background-colo ...
- 菜鸟学Java(五)——JSP内置对象之request
书接上回,上次跟大家概括的说了说JSP的九种常用内置对象.接下来就该聊聊它们各自的特点了,今天先说说request吧. 下面是request的一些常用方法: isUserInRole(String r ...
随机推荐
- OC - 10.使用Quartz2D绘制个性头像
效果图 将一张图片剪切成圆形 在图片周围显示指定宽度和颜色的边框 实现思路 效果图中主要由不同尺寸的两大部分组成 蓝色的背景区域,尺寸等于图片的尺寸加上边框的尺寸 图片区域,尺寸等于图片的尺寸 绘 ...
- MySQL 序列使用
MySQL 序列使用 MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍如 ...
- 一个小玩具:NDK编译FFmpeg的例子
FFmpeg NDK编译 和最简单的APK 准备 硬件: 一台电脑,实验在Lenovo T430上 一个Android设备,实验在 三星S3/A7 编译环境: Ubuntu 14.04 (ant\ja ...
- gearmand的安装
1.安装gperf libuuid-devel yum install -y gperf libuuid-devel 2.安装 libevent yum install libevent libeve ...
- 按钮制作技巧(css精灵效果)-高级版
[转自己以前的文章] 无论用什么语言,大家敲程序的时候多多少少都会遇到做按钮的时候.今天分享一个之前学做按钮的技巧,有人叫做css精灵效果. 通常做按钮的思路都用附图中的第一种:两张图片交互的形式,让 ...
- php处理中文字符串
使用mbstring 先转换成UTF-8编码 mb_convert_encoding(Input::get('tags'),'UTF-8') mbstring用法参考http://php.net/ma ...
- Smarty中{literal}的使用详解
{literal} <script>function Login(){ document.LoginForm.submit();}</script>{/literal} == ...
- iOS开发——C篇&数组与指针
2015-07-17 13:23 编辑 前面我们介绍了关于C语言的内存分配问题,下面我们就开始介绍关于C语言的两个非常重要的知识点:数组与指针 数组与指针其实不仅仅是再C语言中,再OC中(当然OC是内 ...
- Web前端开发人员和设计师必读文章推荐
推荐一个很好的学习资源: Web前端开发人员和设计师必读文章推荐[系列一] Web前端开发人员和设计师必读文章推荐[系列二] Web前端开发人员和设计师必读文章推荐[系列三] Web前端开发人员和设计 ...
- ajax vs oauth
http://www.cnblogs.com/rush/archive/2012/05/15/2502264.html https://www.ibm.com/developerworks/cn/xm ...