初级排序算法
排序算法
是将一组对象
按照某种逻辑顺序重新排列的过程.
排序规则
排序算法
的目标是将所有元素
的主键
按照某种方式排列(通常按照大小
或字母顺序
).排序后索引较大的主键等于索引较小的主键.元素
和主键
的性质在不用的应用中千差万别.在Java中,元素通常都是对象,对主键的抽象则是通过一种内置的机制Comparable
.在创建自己的数据类型时,只需实现Comparale
接口.
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
自定义数据类型中,只需要实现Comprable
接口就能排序,通过compareTo()
方法来定义类型对象的自然次序
.
一般情况下,使用v.copareTo(w)
对元素v
,元素w
比较,如果
- v<w -------> -1
- v=w-------> 0
- v>w--------> 1
注意如果v和w无法比较,或者两者之一为null
,v.compareTo(w)
会抛出一个异常
.此外compareTo()
必须实现一个全序关系,即
自反性
v=v
反对称性
v<w=>
w>v
传递性
v<=w,且w<=x=>
v<=x
模板
下面展示数据排序实现的框架,具有如下方法.
sort()
元素排序
less()
元素比较
exch()
元素交换位置
show()
打印字符数组
public class SortModule {
//排序
public static void sort(Comparable[] a){
}
//比较元素
private static boolean less(Comparable v,Comparable w){
return v.compareTo(w)<0;
}
//交换
private static void exch(Comparable[] a,int i,int j){
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
//打印数组
private static void show(Comparable[] a){
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
System.out.println();
}
}
//判断是否有序
public static boolean isSorted(Comparable[] a){
for (int i = 0; i < a.length; i++)
if (less(a[i],a[i-1])) return false;
return true;
}
public static void main(String[] args){
String a="marklearnjava"
sort(a);
while(isSort(a)){
show(a);
}
}
}
案列对学生类进行排序(主键:年龄)
public class Student implements Comparable<Student>{
private String username;
private int age;
public String getUsername() {
return username;
}
public int getAge() {
return age;
}
public void setUsername(String username) {
this.username = username;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"username='" + username + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student o) {
return this.getAge()-o.getAge();
}
}
public class Test {
public static void main(String[] args) {
Student s1 = new Student();
s1.setUsername("张三");
s1.setAge(18);
Student s2 = new Student();
s2.setUsername("李四");
s2.setAge(20);
Comparable max = getMax(s1, s2);
System.out.println(max);
}
public static Comparable getMax(Comparable c1,Comparable c2){
int result = c1.compareTo(c2);
if (result>=0){
return c1;
}else{
return c2;
}
}
}
未完待续^ - ^