工作、工作、找工作。经过1个多星期的思想斗争还是决定了找JAVA方面的工作,因为好像能比PHP的工资高点。呵呵 :-)  (其实我这是笑脸,什么QQ输入法,模拟表情都没有,忒不人性化了。)

言归正传,既然决定了。就得抓紧时间回顾一下之前的知识,毕竟是我找工作而不是工作找我哈……

排序显然是笔试、面试过程中必定需要掌握的东西。

假定所有排序默认为从小到大排序

1、冒泡排序

设数组长度为N。

第一步:比较相邻的两个元素的大小,如果前面的元素大于后面的元素的值,就将这两个元素的位子进行交换。
第二步:对数组的第0个元素(0是下标)到第N-1个元素 使用第一步的方法顺序进行一次遍历后,最大的一个元素也就像大泡泡会更容易浮出水面一样,“冒”到了最上面。
第三步:对区间范围进行缩减操作,即N=N-1,如果N不为0就重复第二步操作,否则排序就已经完成。

下面按照我们所说的步骤 可以很容易的写出下面代码:

public void bubbleSort(int[] arr){
//外层for循环定义最大数组搜索区间
for(int i=0;i<arr.length;i++) {
//内层for循环定义当前一轮所需要搜索的元素区间,而且从1开始与前一个元素比较,到已经排过序的位子结束
for(int j=1;j<arr.length-i;j++) {
if(arr[j-1]>arr[j]) {
//如果前面一个元素大于当前元素,则对两个元素的位子进行交换
int temp = arr[j-1] ;
arr[j-1] = arr[j] ;
arr[j] = temp ;
}
}//end of for(j)
}//end of for(i)
}

代码中的交换两个元素,其实也是一个小小小考点,如果是写一个swap(int  num1,int num2)方法,则据我所知java全都是值传递,根本就达不到预期的结果。到底还是可以传递整个数组,再传递要交换的两个下标值,可以实现写出交换的swap方法,但是未免有些绕弯的感觉,所以最好还是直接在排序function中直接交换。

另外,就算是交换两个元素的值,也还是有多种方法的!!

最常见的就是像我所写的代码这样:新建一个中间临时变量temp,用于周转,3步可以简单实现交换。

int temp = num1;
num1= num2;
num2= temp ;

还有一种方法,不需要新建中间变量,可能会比第一种稍微有点绕,不过也是很简单就能理解的。如果觉得不太好记住,就画个图吧,保证你能够很快的记住并使用上的。

num1=num1+num2;
num2=num1-num2;
num1=num1-num2;

其他的,还有很多小方法。各种各样的都能够达到这样交换的目的。自己去尝试吧~~~  (用^符号等等都行@!)

总结:再值得一提的是,冒泡排序想哪个看过代码,知道原理的人都应该知道,它的效率是非常低的。

还有2种优化的方法,第一个就是在内循环开始的时候设置一个标志位,如果某一次内循环没有进行一次交换,则说明排序完成,就不需要完整的遍历完2层for循环才结束了。

第二个就是设置一个记录器变量,记录上一次内循环时,最后进行交换的元素的下标,这个记录器变量的意义是,某一次循环的最后一次进行元素交换的位子说明,该位子之后的元素肯定是有序的。下一轮就只需要对记录器变量标识的下标的前段进行排序就行了,以此类推,应该可以减少一些不必要的操作吧。

代码就先不给了,一定要自己实现出来,明白了原理的代码才是自己的代码。千万不可故作装懂,逞一时之快!

2、直接选择排序

数组长度依然为N。

没有原理,我说个毛线!别的不说,先上原理:将数组分为有序区和无序区,在无序区中选择一个最小的元素直接放在有序区的最后。直到无序区没有一个元素或者只剩下一个元素。

第一步:初始化时,默认数组全为无序区。
第二步:在无序区中选取一个值最小的元素,将其与有序区的后一个元素的位子进行交换。交换之后,有序区就像后扩展了一个。
第三步:一直重复第二步的操作,直到无序区元素个数为0或者为1,排序完成。

小二,给客官上代码喽!!!

//直接选择排序算法
public void selectSort(int[] arr) {
int minIndex = -1 ;
for(int i=0;i<arr.length;i++) {
minIndex = i;//默认最小元素的小标为当前无需区间的第一个元素
for(int j=i+1;j<arr.length;j++) {
//在寻找过程中,只记录下标
if(arr[j]<arr[minIndex]) {
minIndex = j ;
}
}
//内循环完毕后即可进行交换,交换小标为i和minIndex的元素
int temp = arr[i] ;
arr[i] = arr[minIndex] ;
arr[minIndex] = temp ;
}
}

重新回到前面的交换两个元素的问题。代码是这样的:

num1=num1+num2;
num2=num1-num2;
num1=num1-num2;

前面 所说的第二种方法还是有些许BUG的,可能是因为代码在虚拟机里的运行顺序问题,还是会导致BUG的产生。读者们可以自己去实验一下。我们人为的原理理论是成立的!但是  代码在机器里的运行顺序不一样就会导致问题了,   这就叫同步的问题了。。。。

提供第三种交换方法:

if(num1 != num2) {
num1 ^= num2;
num2 ^= num1;
num1 ^= num2;
}
采用位运算的方法也可以实现这简单的交换问题。 有人问为什么要加个判断,当两个数不相等的时候才进行位运算。

这个熟悉位运算法则的童鞋都应该明白的!相等或相同的两个数位运算可是为0的。这不就是隐患么,而且,退一万步来说,相等了干嘛还换位子啊。神经呀!嫌运行太快?呵呵.............    0.0

今天就写到这里吧,每天都要不断的提高自己。下次整一点面试题来分析分析~~~  顺便再讲讲其他排序算法。尤其是直接插入排序和直接选择排序的相同和不同。

记住一点:只有懂原理的程序员才是好程序员,而且也更轻松的说。不懂,就要死记硬背。何必呢~~  你说是吧?  何必呢.......必呢..........呢..........

我在北京找工作(二):java实现算法<1> 冒泡排序+直接选择排序的更多相关文章

  1. Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析

    前言:排序在算法中的地位自然不必多说,在许多工作中都用到了排序,就像学生成绩统计名次.商城商品销量排名.新闻的搜索热度排名等等.也正因为排序的应用范围如此之广,引起了许多人深入研究它的兴趣,直至今天, ...

  2. 【排序算法】——冒泡排序、选择排序、插入排序、Shell排序等排序原理及Java实现

    排序 1.定义: 所谓排序,即是整理文件中的内容,使其按照关键字递增或递减的顺序进行排列. 输入:n个记录,n1,n2--,其对应1的关键字为k1,k2-- 输出:n(i1),n(i2)--,使得k( ...

  3. Java常用的经典排序算法:冒泡排序与选择排序

     一.冒泡排序                             冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为 ...

  4. Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)

    一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法 ...

  5. Java版冒泡排序和选择排序

    一.理解说明 1.理解和记忆 冒泡排序:依次定位数组元素,每次只和相邻的且符合条件的元素交换位置. 选择排序:依次在数组的每个位置,通过逐个对比选择出最大或最小的元素. 2.知识点说明 (1)数组是引 ...

  6. 冒泡排序与选择排序(经典版)----java基础总结

    前言:关于冒泡排序和选择排序,每次写的时候都要再看看他们的概念,这次,就自己写明白 1.冒泡排序: 其实冒泡排序应该用例子证明,设数组长度为N. 1.比较相邻的前后二个数据,如果前面数据大于后面的数据 ...

  7. [Java算法] -- 1. 常用排序之冒泡排序和选择排序

    使用Java语言实现冒泡排序和选择排序 推荐一个数据结构可视化的网站:http://zh.visualgo.net/zh (暂时访问不了) 对排序不太熟悉的朋友,建议去上面的网站学习一下,你将会发现一 ...

  8. java面向对象的冒泡排序,选择排序和插入排序的比较

    这三种排序有俩个过程: 1.比较俩个数据. 2.交换俩个数据或复制其中一项. 这三种排序的时间级别 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换  0 ...

  9. 冒泡排序、选择排序、直接插入排序、快速排序、折半查找>从零开始学JAVA系列

    目录 冒泡排序.选择排序.直接插入排序 冒泡排序 选择排序 选择排序与冒泡排序的注意事项 小案例,使用选择排序完成对对象的排序 直接插入排序(插入排序) 快速排序(比较排序中效率最高的一种排序) 折半 ...

随机推荐

  1. 飘逸的python - 用urlparse从url中抽离出想要的信息

    最近有个需求,要检测配置中的那些url的域名是否都正常,即是否都能ping通. 不过配置中url格式是这样的 http://www.something.com:1234/ . 要ping的是www.s ...

  2. 关于cvScalar的那些事

    CvScalar 可存放在1-,2-,3-,4-TUPLE类型的捆绑数据的容器 该函数包含4个浮点成员,可以用来表示B(Blue),G(Green),R(Red),Alpha(表示图像的透明度) ty ...

  3. 新浪微博开放平台开发-android客户端(1)【转】

    http://www.cnblogs.com/virusswb/archive/2011/08/05/2128941.html 最近不是太忙,花了一些时间学习android的应用开发.经过两个星期的学 ...

  4. POJ2151-Check the difficulty of problems(概率DP)

    Check the difficulty of problems Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4512   ...

  5. linux之线程之互斥

    线程概述: 其实在Linux中,新建的线程并不是在原先的进程中,而是系统通过一个系统调用clone().该系统copy了一个和原先进程完全一样的进程,并在这 个进程中执行线程函数.不过这个copy过程 ...

  6. 使用Notepad++快速有效删除复制代码中的行号

    转载:http://plum.0602.blog.163.com/blog/static/1130006502011101524120757/ 试了该方法,很好用! 为什么我把用Notepad++删除 ...

  7. linux定时任务crontab的设置

    linux定时任务crontab的设置http://www.blogjava.net/freeman1984/archive/2010/09/23/332715.html vi /etc/cronta ...

  8. windows 下提取目录下所有文件的文件名

    tree D:/dir /f >D:/filenames.txt 提取D盘dir目录下所有文件名,写入文件filenames.txt

  9. Arduino 时钟模块(clock module) DS1306

    http://www.pjrc.com/teensy/td_libs_DS1307RTC.html 下载相关的库程序 连接: DS1306: 1.接3.3V 2.SDA接A4 3.SCL接A5 读取: ...

  10. php不同版本特性记录

    最近在用php开发时项目中遇到了版本问题,特此记录下php不同版本的一些特性记录,以备忘. 一:php5.3中的新特性 1)开始支持命名空间(Namespace) 2)支持延迟静态绑定(Late St ...