在上一篇博客中,我们提到对数组进行排序,这是数组应用的比较多的一个方面,在很多公司招聘的时候,也会要求手写数组排序代码,同时,对数组进行排序已经开始涉及到一些比较基本的算法与数据结构问题,由此也衍生了多种的排序方法,其中以冒泡排序为主要代表。今天的答案也为冒泡排序,代码如下:
//对数组a={2,8,6,9,7,1,11,3}进行排序。
int[] a =new int[]{2,8,6,9,7,1,11,3};//对数组进行初始化并赋值
System.out.println("排序前的数组为");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+",");
}
System.out.println();//空行
//冒泡排序
for(int i=0;i<a.length;i++){
for (int j = a.length-1; j > i; j--) {
if(a[j] < a[j-1]){
//交换两位置的变量,利用临时值t作为中转
int t = a[j];
a[j] = a[j-1];
a[j-1] = t;
}
}
}
System.out.println("排序后的数组为");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+",");
}
结果如下图显示:
以上就是冒泡排序方法,其原理在这里不多做详述,有兴趣的童鞋可以参考其他人的博客,当然更多建议自己推敲一下,理解的东西才是自己的。当然,这里的冒泡排序法仍有可以优化的地方,比如添加boolean值控制排序的次数等。这里不做过多详述,但方向已经给出,可以自己尝试写一下,但最后先把冒泡排序理解了,否则的话也是一头雾水。
好了,闲话不多说,我们今天的主角是java中的方法,也有人理解成函数或者功能,但本质上都是同一个东西。下面统一用方法称呼。
方法是指将某一段执行代码进行封装起来,只提供一些和外界进行数据交互的接口,以此达到代码安全的一个目的。同时,封装后的方法可以多次被调用,避免了代码的冗余。
嗯,或许很难理解,下面通过一个例子来进行详细说明:
先看方法的基本格式
[权限管理符] 返回类型 方法名([参数1],[参数2]){
//方法体
}
在这里,需要注意几个问题
1.用[]包裹的元素,意思为可有可无,根据实际需求需要
2.返回类型意即调用该方法后需要返回的一个操作结果的数据类型,如果没有,写为void,如果用,则应在方法内部使用return语句返回一个和返回类型一致的数据。
3.方法中参数可以没有,但一旦有多个参数,则参数与参数之间需要用 * , * 隔开。
先看例子,同样,与冒泡排序为例:
package text;
public class Sort {
public static void main(String[] args) {
//对数组a={2,8,6,9,7,1,11,3}进行排序。
int[] a =new int[]{2,8,6,9,7,1,11,3};//对数组进行初始化并赋值
System.out.println("排序前的数组为");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+",");
}
System.out.println();//空行
//调用冒泡排序方法
sort(a); //调用方法时,参数不需要用数据类型声明
System.out.println("排序后的数组为");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+",");
}
}
/**
* 冒泡排序方法
* @param a 参数数组a
*/
private static void sort(int[] a) {//声明方法时,参数需要用数据类型
for(int i=0;i<a.length;i++){
for (int j = a.length-1; j > i; j--) {
if(a[j] < a[j-1]){
//交换两位置的变量,利用临时值t作为中转
int t = a[j];
a[j] = a[j-1];
a[j-1] = t;
}
}
}
}
}
你看,在这里例子中,声明了一个叫做sort(数组)的方法,数组为需要传递的参数,在方法里面实现了对数组的排序操作,那么我们在外界需要对数组进行排序的时候,就可以直接调用该方法来帮忙实现,而不用再重新去敲一遍代码。从而减少了代码冗余,方便以后的维护和修改。在这里,方法就相当于一间厨房,方法名相当于菜单,参数则相当于材料。就好像说,有客人说:我要一份清蒸罗非鱼(应该百度了吧。。),然后扔给厨师一条罗非鱼,那么厨房就自动帮客人弄出了一份清蒸罗非鱼出来。当然,应该也没有多少人会出门吃饭还自带食材的,厨房呢也考虑到了这个,就直接跟客人说,你要是没食材,我们也可以为你提供,你就尽管点菜就行了。这样的话,就是无参方法,也就是调用没有参数的方法了。但是,如果客人想要一份清蒸罗非鱼,但厨房偏偏就没有罗非鱼呀!怎么办,没办法,巧妇难为无米之炊,你要吃罗非鱼,还是得乖乖去买一条,然后交给厨房。也就是说,在一般情况下,为了获得我们需要的结果,我们往往需要给方法提供一些参数,帮助其去实现这些操作。参数不论数量,多少都可以。但为了开发方便,往往有一条准则:需要什么参数,就传递什么参数,用不上的数据,给了也白给,不如不给。
当然,说到参数,自然少不了一些概念问题,也就是形式参数(形参)和实际参数(实参)的辩证问题。在这个问题上,往往有很多人分不清什么是形参,什么是实参。这里做一下简单的分析:
首先,继续上面的例子,我们不难发现,上面的冒泡排序方法中,我们调用了一次sort(a)方法,同时也声明了一个sort(int[] a)方法,在这里,我们调用的sort方法中,传递的数组a,就是实际参数,意思是我们实际上使用的就是这个参数。而在声明sort(int[] a)方法中的int[] a 实际上就是个形式参数,意思是这个参数,其实是一个形式化的东西,是代表着实际参数在方法中进行运算的替身。实际上并没有多少数据意义。我们把他换成int[b] ,的话,也是没问题的。且看:
至此,java中的方法先告一段落。不过需要说明的是:在java中,其实已经封装了许多的方法供送我们调用,我们也可以对这些方法进行改造或者进行其他的操作。但这些知识点现在不说,等待以后,讲述其他知识点时再进行串讲。否则的话,没有案例驱动,是很难理解这些方法的。最后,仍然以数组排序进行结束,不过却是以如何调用java内部分装的一个数组排序的方法实例作为结尾,且看:
当然,并不是说有了这个方法就不需要写冒泡排序了,作为面试中经常遇到的手写代码案例,冒泡排序仍然是需要记忆的一个知识点。希望能够多加训练。