按List中对像某属性排序算法4---JAVA简单选择排序

标签: list 属性 排序算法 | 发表时间:2012-07-30 00:01 | 作者:
出处:http://www.iteye.com

按List中Person类的age属性进行排序。

Person类:

package com.flg;

/**
 * Created with IntelliJ IDEA.
 * User: fuliguo
 * Date: 12-7-29
 * Time: 下午13:09
 * To change this template use File | Settings | File Templates.
 */
public class Person {

    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person(){}

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

 

 

MyPersonListSortTest_SimpleSelection类:

 

package com.flg;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 简单选择排序
 * Created with IntelliJ IDEA.
 * User: fuliguo
 * Date: 12-7-29
 * Time: 下午13:10
 * To change this template use File | Settings | File Templates.
 */
public class MyPersonListSortTest_SimpleSelection {

    /**
     * 获得要测试的list
     * @return   list
     */
    public List getList(){

        List list  = new ArrayList<Person>() ;
        Random random = new Random();
        int j;
       /*
       for(int i=0;i<10;i++){
           j = 1+Math.abs(random.nextInt()%29); //30以内随机数
             //System.out.println("随机数-->>"+j);
             list.add(new Person("张"+j,j));  //年龄随机增长

       }
       */

        list.add(new Person("张6",6));
        list.add(new Person("张9",9));
        list.add(new Person("张12",12));
        list.add(new Person("张18",18));
        list.add(new Person("张16",16));
        list.add(new Person("张20",20));
        list.add(new Person("张3",3));
        list.add(new Person("张27",27));
        list.add(new Person("张30",30));
        list.add(new Person("张30",30));


        return list;

    }

    /**
     * 控制台输出遍历list对像顺序
     * @param list
     */
    public  void printList(List list) {
        Person p;
        for(int i=0;i<list.size();i++){
            p = (Person)list.get(i);
            System.out.println(p.getName()+"---"+p.getAge());
        }

    }

    private void swap(List list,int i,int j){

                Person p1 = (Person)list.get(i);
                Person p2 = (Person)list.get(j);

                list.set(i,p2);
                list.set(j,p1);

    }
    /**
     * 对list进行排序:简单选择排序
     *
     * 简单选择排序就是通过n-i次比较,从n-i+1个记录中选出最小的记录,
     * 并和第i(1<=i<=n)个记录交换
     * 和冒泡相比,减少了比较次数
     * 比较次数为:n-1+n-2+...1=n(n-1)/2次
     *
     * @param list
     */
    public void listSort1(List<Person> list,boolean isAsc){

               int comparaCount = 0;//统计比较次数
               int swapCount = 0;//统计交换次数

               Person p1,p2;
               int i,j,min;

               for( i=0;i<list.size();i++){

                   min = i;

                   for( j=i+1;j<list.size()-1;j++){
                       p1 = (Person)list.get(min);
                       p2 = (Person)list.get(j);

                       comparaCount ++;//统计比较次数
                       if(!(isAsc^(p1.getAge()>p2.getAge()))){ //非运算,非真即假
                          min = j;
                       }
                   }

                   if(i!=min){
                       swap(list,i,min);//i和min位置上的对象交换
                       swapCount++;//统计交换次数
                   }
               }
        //若使用统计比较数comparaCount和统计交换次数swapCount
        //要改成固定方式生成对象,针对同一组对象进行比较,
        // 否则随机生成,前后没有可比性
        System.out.println("listSort1===>comparaCount:"+comparaCount+"||swapCount:"+swapCount);
    }




    public static void main(String [] args) throws InvocationTargetException, IllegalAccessException {

        MyPersonListSortTest_SimpleSelection m = new MyPersonListSortTest_SimpleSelection();

        //排序isAsc:true 升序,false:降序
        boolean  isAsc = true;

        List list = m.getList();
        System.out.println("==========排序前=========");
        m.printList(m.getList());

        
        m.listSort1(list, isAsc); //排序isAsc:true 升序,false:降序
        System.out.println("listSort1==========排序后=========");
        m.printList(list);



    }
}

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [list 属性 排序算法] 推荐:

按List中对像某属性排序算法4---JAVA简单选择排序

- - ITeye博客
按List中Person类的age属性进行排序. * User: fuliguo * Date: 12-7-29 * Time: 下午13:09 * To change this template use File | Settings | File Templates. MyPersonListSortTest_SimpleSelection类:.

排序算法

- - 互联网 - ITeye博客
排序算法有很多,所以在特定情景中使用哪一种算法很重要. 为了选择合适的算法,可以按照建议的顺序考虑以下标准: .     对于数据量较小的情形,(1)(2)差别不大,主要考虑(3);而对于数据量大的,(1)为首要.  一、冒泡(Bubble)排序——相邻交换 .  二、选择排序——每次最小/大排在相应的位置 .

2015,Google 的 to do list

- - 博客园_新闻
Google 是一家很有抱负的公司. 和去年一样,今年 Google 做了很多事情,多到有点数不清. ArsTechnica 做了详细的梳理,整理了 Google 今年收购的公司以及之后所做的动作,知道它在下一年的打算. Nest 与 Google 智能家居野心. 年初,Google 用 32 亿美元收购 Nest.

排序算法 Sleep Sort

- Jeff - 酷壳 - CoolShell.cn
排序算法好像是程序员学习编程最多的算法,也可能是算法研究者们最喜欢研究的算法了. 排序有很多很多的算法,比如,冒泡,插入,选择,堆,快速,归并等等(你可以看看本站以前的那些文章:可视化的排序,排序算法比较,显示排序过程的python)这里向大家介绍一个“巨NB”的排序算法——Sleep Sort. 闲言少说,请看下面的代码(用Shell脚本写的).

“天才”排序算法:Sleepsort

- Sirius - 黑客志
4chan上某位神人发明的天才排序算法:Sleepsort,充分发挥多核威力,评论中还有更多优化版本:. TermKit: 下一代的Mac命令行/终端程序.

SegmentFault问答排序算法

- - 标点符
SegmentFault 参考了 Stack Overflow的热门算法设置了自己的排序算法,具体排序算法如下:. 对于热门文章,使用了如下公式:. views:浏览量,对浏览量做了一次去对数处理,主要是为了防止某些浏览量较大的文章异军突起,待在榜单迟迟不动. recommendScore/collectScore:文章的推荐数和收藏数,直接加和到分子中,作为文章热门程度的考虑因素.

PHP RFC: 让PHP的foreach支持list

- 三马 - 风雪之隅
本文地址: http://www.laruence.com/2011/07/13/2110.html. 上个月, 终于算加入了PHP developer team, 一直以来最大的障碍就是语言, 现在想起来, 当年真应该更加认真努力的去学习英语.. 得到的第一个任务是: 解决一个feature request, 请求在allow foreach($array as list($a,$b).

LevelDB中的Skip List(跳跃表)

- jiaosq - NoSQLFan
本文是关于Skip List数据结构的,Skip List是在有序List(链表)数据结构的基础上的扩展,解决了有序链表结构查找特定值困难的问题,使用Skip List,可以使得在一个有序链表里查找特定值的时间复杂度为O(logn),在本文中我们看到,Skip List被用在leveldb中,实际上它还被使用在Redis的sorted sets数据结构中.

常用排序算法小结

- - ITeye博客
离开课堂后,排序算法写的比较少了,当有排序的要求时,一般用的比较多的是直接采用Arrays.sort以及Collections.sort结合比较器来实现. Arrays工具类包含了对各种类型数组的排序,以下是Arrays中包括的sort方法:. 以下是 Collections中的sort方法,该sort方法中结合了Arrays.sort来实现的.

Java排序算法:归并排序

- - zzm
 Java排序算法(九):归并排序. 归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的. 然后再把有序子序列合并为整体有序序列. 归 并排序是建立在归并操作上的一种有效的排序算法. 该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.