Java冒泡排序法出现问题

请问一下我的排序为什么出现了错误,重复了一个还少了一个。
public static void main(String[] args) {
Teacher teacher = new Teacher("张飞", '男', 25, 5);
teacher.printInfo(); // 封装
System.out.println("-");
Student student = new Student("小明", '男', 15, "00023102");
student.printInfo();

    // 定义多态数组,里面保存2个学生和2个教师,要求按年龄从高到低排序。
    Person[] persons = new Person[4];
    persons[0] = new Student("jack", '男', 15, "0001");
    persons[1] = new Student("tom", '女', 16, "0002");
    persons[2] = new Teacher("关羽", '男', 29, 5);
    persons[3] = new Teacher("刘备", '女', 24, 3);

    // 创建对象
    HomeWork13 homeWork13 = new HomeWork13();
    homeWork13.bubbleSort(persons);

    //输出排序后的数组
    System.out.println("排序后的数组情况");
    for (int i = 0; i < persons.length; i++) {
        System.out.println(persons[i]);
    }
}

// 方法,完成年龄从高到低排序
public void bubbleSort(Person[] persons) {
    Person temp = null;
    for (int i = 0; i < persons.length - 1; i++) {
        for (int j = 0; j < persons.length - 1 - i; j++) {
            // 判断条件,注意这里的条件可以根据需要进行变化
            if (persons[j].getAge() < persons[j + 1].getAge())
                temp = persons[j];
            persons[j] = persons[j + 1];
            persons[j + 1] = temp;
        }
    }
}

}
package com.edu.HomeWork.homework13;

public class Person {
private String name;
private char sex;
private int age;

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

public String getName() {
    return name;
}

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

public char getSex() {
    return sex;
}

public void setSex(char sex) {
    this.sex = sex;
}

public int getAge() {
    return age;
}

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

// 编写一个play方法,把共有的输出内容写到父类
public String play() {
    return name + "爱玩";
}

/* 父类返回一个基本信息
老师的信息:                    学生的信息:
姓名:张飞                      姓名:小明
年龄:30                       年龄:15
性别:男                        性别:男
工龄:5                         学号:00023102
我承诺,我会认真教课。            我承诺,我会好好学习。
张飞爱玩象棋                     小明爱玩足球
 */
public String basicInfo() {
    return "姓名:" + name + "\n年龄:" + age + "\n性别:" + sex;
}

@Override
public String toString() {
    return "Person{" +
            "name='" + name + '\'' +
            ", sex=" + sex +
            ", age=" + age +
            '}';
}

}
package com.edu.HomeWork.homework13;

public class Student extends Person {
private String stu_id;

public Student(String name, char sex, int age, String stu_id) {
    super(name, sex, age);
    this.stu_id = stu_id;
}

public String getStu_id() {
    return stu_id;
}

public void setStu_id(String stu_id) {
    this.stu_id = stu_id;
}

public void study() {
    System.out.println("我承诺,我会好好学习");
}
/**
学生爱玩足球
 */
@Override
public String play() {
    return "学生" + super.play() + "足球";
}

// 编写一个输出信息的方法,这样就体现封装
public void printInfo(){
    System.out.println("学生的信息:");
    System.out.println(basicInfo());
    System.out.println("学号:" + stu_id);
    study();
    System.out.println(play());
}

@Override
public String toString() {
    return "Student{" +
            "stu_id='" + stu_id + '\'' +
            '}' + super.toString();
}

}
package com.edu.HomeWork.homework13;

public class Teacher extends Person {
private int work_age;

public Teacher(String name, char sex, int age, int work_age) {
    super(name, sex, age);
    this.work_age = work_age;
}

public int getWork_age() {
    return work_age;
}

public void setWork_age(int work_age) {
    this.work_age = work_age;
}

public void teach() {
    System.out.println("我会认真教学");
}

/**
 * 教师爱玩象棋
 * @return
 */
@Override
public String play() {
    return "教师" + super.play() + "象棋";
}
// 编写一个输出信息的方法,这样就体现封装
public void printInfo(){
    System.out.println("教师的信息:");
    System.out.println(basicInfo());
    System.out.println("工龄:" + work_age);
    teach();
    System.out.println(play());
}

@Override
public String toString() {
    return "Teacher{" +
            "work_age=" + work_age +
            '}' + super.toString();
}

}
排序后的数组情况
Teacher{work_age=3}Person{name='刘备', sex=女, age=24}
Student{stu_id='0002'}Person{name='tom', sex=女, age=16}
Student{stu_id='0002'}Person{name='tom', sex=女, age=16}
Student{stu_id='0001'}Person{name='jack', sex=男, age=15}

请看一个很简明的例子:http://t.csdn.cn/uSb1z

你的排序方法是错误的,一般的冒泡排序要么是从前往后冒泡,越小/越大的元素在每一次 “ 冒泡 ” 慢慢走到了最后,直到整个数组完全有序
;要么是从后往前循环, 越小/越大的元素在每一次“ 冒泡 ”中也会往后移动,直到元素有序。
你的排序方法有问题,内存循环中的if判断不对

img

改成这样就没问题了

// 判断条件,注意这里的条件可以根据需要进行变化
if (persons[j].getAge() > persons[j + 1].getAge()) {
    temp = persons[j];
    persons[j] = persons[j + 1];
    persons[j + 1] = temp
}

完成年龄从高到低排序这个方法稍作修改即可:

// 方法,完成年龄从高到低排序
public void bubbleSort(Person[] persons) {
    Person temp = null;
    for (int i = 0; i < persons.length - 1; i++) {
        for (int j = 0; j < persons.length - 1 - i; j++) {
           // 判断条件,注意这里的条件可以根据需要进行变化
           if (persons[j].getAge() > persons[j + 1].getAge()) {
               temp = persons[j];
               persons[j] = persons[j + 1];
               persons[j + 1] = temp
           }
        }
    }
}