1. 程式人生 > 其它 >Java自定義物件陣列實現氣泡排序和二分法查詢

Java自定義物件陣列實現氣泡排序和二分法查詢

自定義物件陣列實現氣泡排序

排序演算法多種多樣,今天只玩氣泡排序,不用基本資料型別了,用自定義物件型別建立陣列並實現氣泡排序

  1. 先建立自定義實體物件 Student

    import java.io.Serializable;
    import java.util.Objects;
    
    public class Student implements Serializable, Comparable<Student> {
        
        private static final long serialVersionUID = -6426911555504380355L;
    
        private int id;         // 學號
        private String name;    // 姓名
        private int age;        // 年齡
        private int math;       // 數學成績
        private int eng;        // 英語成績
        private int chin;       // 語文成績
        
        // 省略無參,有參,get(),set(),toString()方法
        
        // 重寫 equals 比較策略
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Student student = (Student) o;
            return id == student.id;
        }
    	// 以及重寫 hashCode 保持一致性
        @Override
        public int hashCode() {
            return Objects.hash(id);
        }
        
        // 實現比較規則
        @Override
        public int compareTo(Student o) {
    
            // 考試成績排名 總分高的在前 總分相等的 比較 語文 數學 英語 的單科分數 來決定 排名先後
    
            // 判斷是否是一個物件地址
            if (this == o) {
                return 0;
            }
    
            // 呼叫者的總成績
            int a = this.chin + this.math + this.eng;
    
            // 比較者的總成績
            int b = o.chin + o.math + o.eng;
    
            // 比較總成績
            if (a > b) {
                return 1;
            }
            if (a < b) {
                return -1;
            }
            // 總成績的相等時
            if (a == b) {
                // 比較語文
                if (this.chin > o.chin) {
                    return 1;
                }
                if (this.chin < o.chin) {
                    return -1;
                }
                if (this.chin == o.chin) {
                    // 比較數學
                    if (this.math > o.math) {
                        return 1;
                    }
                    if (this.math < o.math) {
                        return -1;
                    }
                    if (this.math == o.math) {
                        // 比較英語
                        if (this.eng > o.eng) {
                            return 1;
                        }
                        if (this.eng < o.eng) {
                            return -1;
                        }
                    }
                }
            }
    		
            return 0;
        }
        
    }
    
    1. 開始冒泡

      // 先準備學生資料
      Student[] students = {
          new Student(1001, "小一", 18, 75, 65, 89),
          new Student(1002, "小二", 18, 15, 23, 55),
          new Student(1004, "小四", 19, 95, 90, 100),
          new Student(1005, "小五", 18, 45, 75, 68),
          new Student(1006, "小六", 20, 10, 15, 35),
          new Student(1007, "小七", 18, 75, 58, 68),
      };
      
      // 列印初始資料
      for (Student student : students) {
          System.out.println("student before = " + student);
      }
      
      // 使用 Arrays 工具類實現排序
      Arrays.sort(students);
      
      // 列印排序後的資料
      for (Student student : students) {
          System.out.println("student after = " + student);
      }
      

      自定義氣泡排序方法

      public static void bubbleSort(Student[] students) {
      
          // 臨時交換物件
          Student temp = null;
          
          for (int i = 0; i < students.length; i++) {
      
              // 標記經過一輪迴圈是否進行了交換
              boolean flag = true;
      
              for (int j = 0; j < students.length - i - 1; j++) {
      
                  // 通過Student實體自定義重寫的compareTo方法進行比較
                  if ((students[j].compareTo(students[j + 1])) > 0) {
                      
                      temp = students[j];
                      students[j] = students[j + 1];
                      students[j + 1] = temp;
                      // 打上交換的標記
                      flag = false;
                  }
              }
      
              // 根據標記判斷是否已經完成排序
              if (flag) {
                  break;
              }
              // 列印氣泡排序的次數
              System.out.println((i + 1) + "趟排序");
          }
      }
      

      呼叫自定義氣泡排序

      // 呼叫靜態方法
      類名.bubbleSort(studentsCopy);
      
      // 遍歷排序後的陣列資訊
      for (Student student : studentsCopy) {
          System.out.println("bubbleSort student = " + student);
      }
      

自定義物件陣列實現二分法查詢

// 自定義二分查詢方法
public static int MyBinarySearch(Student[] students, Student student) {

    // 標記陣列的最低位和最高位
    int lowIndex = 0;
    int highIndex = students.length - 1;

    // 進入迴圈的必要條件
    while (lowIndex <= highIndex) {

        // 二分取中間索引
        int middleIndex = (lowIndex + highIndex) / 2;

        // 判斷兩個學生的學號是否相等 student 已經重寫了 equals 方法
        if (students[middleIndex].equals(student)) {
            return middleIndex;
        }

        // 如果中間學生的學號 大於 尋找學生的學號 那判斷 陣列中間 前半段的資料即可
        if (students[middleIndex].getId() > student.getId()) {

            highIndex = middleIndex - 1;
        }

        // 如果中間學生的學號 小於 尋找學生的學號 那判斷 陣列中間 後半段的資料即可
        if (students[middleIndex].getId() < student.getId()) {
            lowIndex = middleIndex + 1;
        }
    }

    // 返回負數代表沒有找到
    return -1;
}

呼叫自定義二分查詢法

int binarySearchIndex = StudentArraysTest.MyBinarySearch(studentsCopy, new Student(1005, "小五", 18));

System.out.println("binarySearchIndex = " + binarySearchIndex);

// 通過查詢到的下標列印學生的資訊
if (binarySearchIndex >= 0 && binarySearchIndex < studentsCopy.length) {

    System.out.println(studentsCopy[binarySearchIndex]);
} else {

    System.out.println("沒有找到該學生的資訊");
}