A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-邢广耀 中级黑马   /  2012-12-25 11:59  /  2160 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马-邢广耀 于 2012-12-27 10:14 编辑

数组中的选择排序和冒泡排序,折半查找,老是写错代码,有没有更加通俗易懂的方法,便以记忆,请各位大神指教,谢谢

点评

其实最好的就是要理解整个排序的过程以及算法  发表于 2012-12-27 10:51

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

7 个回复

倒序浏览
我也没怎么记代码,就是画了个图,掌握思路。自己有一份已经写好的代码,随时使用
回复 使用道具 举报
你把写出代码的思路多看看几遍,先把代码背熟了,然后慢慢的多写写你就能体会出来了。
回复 使用道具 举报
我总结了下,以从小到大排为例:
1、冒泡排序:冒泡排序就是两两比较,大者前,小者后,先Arrays[0]和Arrays[1]比较,再重新赋值,将数字大的值赋给Arrays[1],然后再Arrays[1]和Arrays[2]比较,如此反复循环,大者前,下者后,就好像大泡不断的把小泡挤到后面,等比较到Arrays[Arrays。length-1](即最高位)时,必能得出数组中最大值并赋给Arrays[Arrays。length-1]
    接着,以从Arrays[0]到Arrays[Arrays.length-2]的数组成员为对象,再进行上述过程,得出这些成员的最大值并赋给Arrays[Arrays。length-2]
   然后就这么一轮轮筛选比较,最终确定顺序
2、选择排序法:选择法,是假定了一个最值,所以最值和其他的值的交换就发生在假定最值的地方,具体就是假定数组最高位成员就是数组最大值,你用数组最高位成员依次和所有成员比较,如果比数组最高位数字大,就进行数值交换,如果不比它打,就跳过,和下一个成员进行比较,如此反复,最终结果是数组最高位肯定是最大值。
然后再用上述方法讲第二大值赋给第二高位,如此反复循环,最终确定数组顺序

冒泡排序法和选择排序法的区别:冒泡排序法,挨个两个两个的比较,只杀熟,最后把最大的推到最高位,选择排序法则是一开始就那最高位和所有数比较,选出最大值赋给最高位。
冒泡排序法是一层层选拨比较,有点像通关打游戏,选择排序法就有点像全民选举,一开始就选出最厉害当老大,然后再选老二

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
谢谢,我仔细看看了毕老师的视频,明白了
回复 使用道具 举报
有,在Arrays类里面有排序方法,不用自己去写的,嘻嘻
回复 使用道具 举报
这是我用C写的折半查找,折半查找和一些其他的排序如冒泡选择之类的你需要注意下边界条件就好了,代码不需要刻意去记的,只需要记住思想,多用一下就可以了
  1. /*二分查找,a为递增序列*/
  2. int BinSearch(int a[],int n,int x)
  3. {
  4.         int low=0,high = n-1,mid;
  5.         while(low<=high)
  6.         {
  7.                 mid = (low+high)/2;
  8.                 if (a[mid]==x)return mid;  
  9.                 else if(a[mid]>x)high = mid-1;  //即中间值大于x,在下半段
  10.                 else low = mid+1;                                //中间值小于x,在上半段
  11.         }
  12.         return -1;
  13. }
复制代码
回复 使用道具 举报

我觉的写排序的代码关键还是要搞清楚排序的原理,看懂这两张图,基本上代码就能写出来了。(按从小到大排)。
选择排序:
       for(int x = 0;x < arr.length-1;x++){
                 for(int y = x+1;y < arr.length;y++){...}

把数组看成若干个格子装着数,x=0 指选择第一个格子。然后用第二个格子里的数跟它比较,如果比它小则交换位置。然后再用第三个第四个比...循环到最后一个数,最后得到第一个格子的数。
然后再选择第二个格子,循环重复得到第二个格子的数。
...两个循环都走完。从小到大的排列就出来了。因为不能自己和自己比,所以x<arr.leng-1;由于每次都能得到一个格子的数,y不用调用那个数,所以y=x+1;

冒泡排序:
for(int x = 0;x <arr.length;x++){
                        for(int y = 0;y <arr.length-x-1;y++){
                                     if(arr[y] < arr[y+1]){}...}
冒泡排序是相邻两个格子的数做比较,一开始也是从第一个格子和第二个格子比较,第二个格子和第三个再比较,能确定的是最后一个格子里是最大值。就像前面的师兄说的是像泡泡一样把大的挤到后面了。
循环到第二次再来做比较的时候,最后一个格子里的数就不用再比较了。所以y<arr.length-x-1。


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马