按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("张30",30));
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));
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();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);
}
}
过程分析帮助理解:
此方法的思想就是从i+1位置开始往后找出包括i位置在内的最小的值放到i的位置上。
此处用了一个中间变量min来记录本轮最小值的下标。
以下为伪代码,仅供帮助理解:
初始数组:
[30 6 9 12 18 16 20 3 27 30]
第一轮(指以i为轮次计数)
i=0 min=0 此时list[min=0]=30
从j=i+1 也就是list[1]位置开始往后循环,
list[1]=6比list[min=0]=30小,所以让min=1,
此后j一直++,直到运行到list[7]=3比list[min=1]=6小,所以让min=7,
一轮下来只做一次交换,就是把最小的和i位置的交换,前提是i不是最小的,这样数组就变成
[3 6 9 12 18 16 20 30 27 30]
第二轮
i=1 min=1 此时list[min=1]=6;
从j=i+1=2 也就是list[2]=9的位置开始往后循环。
这一轮下来,最小值在i的位置上没变,所以不用替换位置。这样数组没变
[3 6 9 12 18 16 20 30 27 30 ]
... ... ...
... ... ...
以次类推,直到第8轮
i=7 list[min=7]=30
从j=i+1 也就是list[8]=27的位置开始往后循环,发现27比30小,所以让min=8
这一轮下来,数组变成
[3 6 9 12 18 16 20 27 30 30]
第9轮没有变化
排序完毕