再谈数组

在这一篇中我们来讲一下关于数组的排序和查找的方法。

排序

说到数组的排序,就不得不说冒泡这种经典的方法。

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(十五)的更多相关文章

  1. 没有基础的初学者学java怎样快速入门?超全的学习路线图

    现在地球人都知道互联网行业工资高,上万都是小case,不值一提.可是对于大部分人来说,工资七八千都算很难了.那我也想学java,当程序员,赚大钱.可是作为一个初学者,怎样才可以快速入门呢?早点入门就可 ...

  2. java十五个常用类学习及方法举例

    <code class="language-java">import java.util.Scanner; import java.util.Properties; i ...

  3. 初学者学Java常遇到的问题,我都给你回答了!

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 春节在家刷知乎,看到了一个知乎的问题:<学 ...

  4. 零基础学Java第五节(面向对象一)

    本篇文章是<零基础学Java>专栏的第五篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] 类与对象 在哲学体系中,可以分为主 ...

  5. Java从零开始学四十五(Socket编程基础)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  6. Java从零开始学三十五(JAVA IO- 字节流)

    一.字节流 FileOutputStream是OutputStream 的直接子类 FileInputStream也是InputStream的直接子类 二.文本文件的读写 2.1.字节输入流 Test ...

  7. Java从零开始学二十五(枚举定义和简单使用)

    一.枚举 枚举是指由一组固定的常量组成的类型,表示特定的数据集合,只是在这个数据集合定义时,所有可能的值都是已知的. 枚举常量的名称建议大写. 枚举常量就是枚举的静态字段,枚举常量之间使用逗号隔开. ...

  8. 学JAVA第五天,今天困得要死

    好不容易坚持到第五天了,继续继续!!! 今天老师没有讲JAVA的for循环,倒是讲了HTML的相关内容: 讲了JAVA代码怎么在HTML中运行. 只要在HTML加入这个 background-colo ...

  9. 菜鸟学Java(五)——JSP内置对象之request

    书接上回,上次跟大家概括的说了说JSP的九种常用内置对象.接下来就该聊聊它们各自的特点了,今天先说说request吧. 下面是request的一些常用方法: isUserInRole(String r ...

随机推荐

  1. Java面向对象的概念以及OOP思想的优点

    传统面向过程程序设计的思路: 先设计一组函数用来解决一个问题,然后确定函数中需要处理的数据以及存储位置. 面向对象的设计的思路: 先确定处理的数据,然后确定处理数据的算法,最后将数据和算法封装在一起构 ...

  2. SQL利用临时表实现动态列、动态添加列

    --方法一--------------------------------------------------------------------- declare @sql as varchar(1 ...

  3. 七、C# 接口

    并非只能通过继承使用多态性,还能通过接口使用它. 和抽象类不同,接口不包含任何实现(方法). 然后和抽象类相似,接口也定义了一系列成员,调用者可以依赖这些成员来支持一个特定的功能.   实现接口的类会 ...

  4. java学习——集合框架(泛型,Map)

    泛型: ... Map:一次添加一对元素.Collection 一次添加一个元素. Map也称为双列集合,Collection集合称为单列集合. 其实map集合中存储的就是键值对. map集合中必须保 ...

  5. Linux系统中,main函数的执行过程

    http://blog.csdn.net/rrerre/article/details/6728431

  6. Linux下的Job Control(转:http://blog.chinaunix.net/uid-26495963-id-3062757.html)

    一.Job的概念 Job是指在批处理的环境中,为完成某一任务而进行一系列操作的总称.在个人接触计算机的年代,批处理的环境已经不容见到了,只有一些特殊的行业和环境下还在使用这样的概念,仅在书本中接触过. ...

  7. 14_RHEL7安装mplayer

    这里用nux-dextop仓库来配置 Nux Dextop桌面对CentOS和RHEL 6/7可用.它是一个面对CentOS.RHEL.ScientificLinux的含有许多流行的桌面和多媒体相关的 ...

  8. Ajax的load方法演示

    load方法的参数形式为: load(url,[data],[callback]); 其中url为请求HTML页面的URL地址.[data]表示发送至服务器的key/value数据.callback表 ...

  9. canvas 渐变

    那么第一种渐变方式就是LinearGradient,具体实施就是以下代码: var colorStyle=context.createLinearGradient(0,0,0,HEIGHT); col ...

  10. JS判断鼠标从哪个方向进入DIV容器

    写的不够高大上 , 不要介意哦... Js: //进去 $(".flash").bind("mouseenter",function(e){ /** the w ...