数据结构与算法__冒泡排序__Java外比较器和内比较器(排序专题)
Posted ChinaManor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法__冒泡排序__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]<arr[j+1]
如果自己写排序,费时费力 所以下面我们介绍两种为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<Person>() {
@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类中写一个内比较器
一个类在不同题目中,经常是要不同方式排序, 外比较器使用频率最高
以上是关于数据结构与算法__冒泡排序__Java外比较器和内比较器(排序专题)的主要内容,如果未能解决你的问题,请参考以下文章