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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈郊 中级黑马   /  2012-10-2 08:29  /  1138 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

第五天   总结
1.选择排序
        原理: 用数组中某个位置元素与其后所有元素进行比较,最值出现在当前这个元素的位置然后用其后的元素与其它的元素进行比较,依此类推。最值出现在数组的左边
              例如: 数组名 arr   
             我们用下标为0的元素与其后元素进行比较, 0---->1,2,3,...length-1
             然后用下标为1的元素与其后元素进行比较.  1---->2,3,4,...length-1
             以些类推
代码实现
    for(int x=0;x<arr.length-1;x++){
//最后一个元素不需要比较或者(int i=x+1;i<arr.length;i++) {        //x+1?,因为我们要与x后所有元素进行比较
if(arr[x]>arr){  //用x位置元素去比较,最值出现在x位置.
                                int tmp=arr[x];
                                arr[x]=arr;
                                arr=tmp;
                        }
                }
    }
2.冒泡排序
                原理: 相邻两个元素进行比较。如果满足条件就进行位置置换。内循环结束一次,最值出现在尾下标位置。
   代码实现
                        for(int k=0;k<arr.length-1;k++){ //控制比较多少轮
                                        for(int i=0;i<arr.length-1-k;i++){ //为什么减1,因为i位置元素与i+1位置元素比较//-k操作是为了将右边比较后出现的最值刨掉,也就是最右边出现的最值,不在参与比较
                                        if(arr>arr[i+1]){
                                                int tmp=arr;
                                                arr=arr[i+1];
                                                arr[i+1]=tmp;
                                        }
                                }                 
                        }        
优化
                排序优化:无论选择还是冒泡,在比较后都要进行交换元素,我们可以将交换元素操作提取成方法
代码实现
/*      对数组中指定位置上的两个元素进行交换
                参数: 1.数组 2,数组中元素的下标   3.数组中元素的下标
                返回值:
*/
                public static void swap(int[] arr,int i,int j){
                        int tmp=arr;
                        arr=arr[j];
                        arr[j]=tmp;
                }
3.选择排序优化
        1.以前操作我们在比较后,直接将数组中的元素进行了交换,数组中的元素是存储在堆内存中,操作它效率比较低。
    2.怎样优化这个过程
                我们定义一个变量用来保存最值的下标,当一轮操作后,记录了最值的下标,然后用其与要交换的元素进行交换。现在一次交换就可以实现将最值保存到数组的左边.
代码实现
                        for(int x=0;x<arr.length-1;x++){
                                int index=x;//index用来保存最值的下标.
        for(int i=x+1;i<arr.length;i++){                        //为什么x+1,因为我们要与x后所有元素进行比较
                                       if(arr[index]>arr){
                     //用x位置元素去比较,最值出现在x位置.
                                                index=i;
                                        }
                                }
                        if(x!=index){        //进行交换
                      swap(arr,x,index);//进行一次交换就将数组中的最值放到数组的最左边.
                                }
                         }
思考:
          在交换时为什么将数组与数组下标传过去,而不是直接将数组中的元素值传过去。如果传的是数组,那么在操作时会将数组中的元素进行交换。如果传的是数组中的元素值,那么在交换时,不会影响到数组中的元素
基本类型与引用类型有什么区别
                基本类型它在内存中直接存储其值在内。
                引用类型存的不是直正的值,它存储的是实体的地址,我们只是通过引用来操作这实体
                局部变量:在方法内声明,它是存储在栈内。
        引用类型指向的实体是存储在堆内的。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马