数据结构与算法__冒泡排序__Java外比较器和内比较器(排序专题)
大家好,我是ChinaManor,直译过来就是中国码农的意思,我希望自己能成为国家复兴道路的铺路人,大数据领域的耕耘者,平凡但不甘于平庸的人。 要是数据结构那么简单没人想当码农,为了摆脱码农还是得硬着头皮学
目的:为了更好地学习和理解数组排序,为了面试作准备 冒泡排序:是一种计算机科学领域较常见的排序算法。 因为它的算法就如同 碳酸饮料中二氧化碳气泡最终会上浮到顶端一样,所以形象化称为“冒泡排序”
原理小结:
依次“对比”或“交换”数组中每两个相邻的元素, 使最值元素通过交换,慢慢“浮到”数组顶端。
课堂代码:
/**
* 冒泡入门-第三版
*
* 相邻元素: j 和 j+1
* @param args
*/
public static void main(String[] args) {
int[] arr = {55,44,11};
System.out.println("冒泡前:"+ Arrays.toString(arr));
for (int i = 1; i < arr.length; i++) {
for (int j = 0; j <arr.length-i ; j++) {
if(arr[j]>arr[j+1]){
//交换
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
System.out.println(Arrays.toString(arr));
}
}
}
/**
* 冒泡入门-第三版
*
* 相邻元素: j 和 j+1
* @param args
*/
public static void main(String[] args) {
int[] arr = {55,44,11};
System.out.println("冒泡前:"+ Arrays.toString(arr));
for (int i = 1; i < arr.length; i++) {
for (int j = 0; j <arr.length-i ; j++) {
if(arr[j]>arr[j+1]){
//交换
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
System.out.println(Arrays.toString(arr));
}
}
}
升序—从小到大: arr[j]>arr[j+1] 降序—从大到小: arr[j]
如果自己写排序,费时费力 所以下面我们介绍两种为List集合进行排序
5.2准备数据 Person类:
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + ''' +
", age=" + 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;
}
}
Demo1类:
public class Demo1 {
public static void main(String[] args) {
//1、准备数据
ArrayList<Person> plist = new ArrayList<Person>();
plist.add(new Person("小1",15));
plist.add(new Person("小2",19));
plist.add(new Person("小3",11));
plist.add(new Person("小4",16));
plist.add(new Person("小5",12));
}
}
5.3Comparator比较器(外比较器)
凡是实现了Comparator接口的类,都是外比较器类。 只要重写接口中的compare方法,即可完成比较。 示例:
public static void main(String[] args) {
//1、准备数据
List<Person> plist = new ArrayList<Person>();
plist.add(new Person("小1",15));
plist.add(new Person("小2",19));
plist.add(new Person("小3",11));
plist.add(new Person("小4",16));
plist.add(new Person("小5",12));
//2、处理数据:通过人的年龄,比较大小。
plist.sort(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge()-o2.getAge();
}
});
System.out.println(plist);
}
建议:无需记忆何谓从大到小,何谓从小到大,尝试一次即可
另一种方式:
Collections.sort(plist, new Comparator() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge()-o2.getAge();
}
});
注意: 正数、0: o1和o2位置就不会交换 负数: o1和o2位置交换
使用环境: 适用于一题多解的模式。 Person类,先进行年龄排序,后面可能还会进行成绩排序,学号排序
5.4Comparable接口(内比较器)
需要Person类自己实现Comparable接口,通过Collections工具进行排序比较 Person类:
public class Person implements Comparable{
private String name;
private int age;
@Override
public int compareTo(Object o) {
return this.getAge()-((Person)o).getAge();
}
@Override
public String toString() {
return "Person{" +
"name='" + name + ''' +
", age=" + 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;
}
}
Demo1类:
public static void main(String[] args) {
//1、准备数据
List<Person> plist = new ArrayList<Person>();
plist.add(new Person("小1",15));
plist.add(new Person("小2",19));
plist.add(new Person("小3",11));
plist.add(new Person("小4",16));
plist.add(new Person("小5",12));
//2、处理数据
Collections.sort(plist);
System.out.println(plist);
}
注意: 比较器的CompareTo方法: 正数、0:不会交换 负数:交换位置
排序总结
如果一个类在不同题目中以各种方式排序,就用Comparator外比较器。 例如:Person类在题目1中用年龄排序 在题目2中用分数排序 在题目3中用生日排序 这时,一道题就要写一个外比较器
如果一个类在不同题目中以同一种方式排序,就用Comparable内比较器 例如:Person类在题目1、题目2、题目3中 都是用年龄排序,这时,就可以统一在Person类中写一个内比较器
一个类在不同题目中,经常是要不同方式排序, 外比较器使用频率最高
相关文章
- Jease 2.6发布 Java开源内容框架
- JVM调优总结:反思
- JVM调优总结:调优方法
- JVM调优总结:新一代的垃圾回收算法
- JVM调优总结:典型配置举例
- JVM调优总结:分代垃圾回收详述
- JVM调优总结:垃圾回收面临的问题
- JVM调优总结:基本垃圾回收算法
- JVM调优总结:一些概念
- 用Java GUI编写的画板程序
- Java的动态绑定机制
- jOOQ 2.0.2发布 Java的ORM框架
- Java中带复选框的树的实现和应用
- Java网络编程菜鸟进阶:TCP和套接字入门
- 甲骨文与谷歌专利权之争定于今年三月开审
- Java调用C/C++编写的第三方dll动态链接库
- 集成开发环境 NetBeans IDE 7.1正式版发布
- kangle 2.7.5紧急发布 防hash碰撞攻击
- 东方通技术引领模式为国产软件“争权”
- UML中关联,组合与聚合等关系的辨析