今天介绍三种排序方法:冒泡排序、选择排序、插入排序;另写了一个对象数组测试对于对象排序的实现。
冒泡排序:冒泡排序,是指计算机的一种排序方法,它的时间复杂度为O(n^2),虽然不及堆排序、快速排序的O(nlogn,底数为2),但是有两个优点:1.“编程复杂度”很低,很容易写出代码;2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。不过,一路、二路归并排序、不平衡二叉树排序的速度均比冒泡排序快,且具有稳定性,但速度不及堆排序、快速排序。冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数。大泡在上,小泡在下——冒泡排序基本原理。
选择排序:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
插入排序:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的位置。
下面来看代码:
package ch02Sort; public class SortArray { //数组 private long[] arr; //有效长度 private int elems; //默认构造方法 public SortArray(){ arr = new long[50]; } public SortArray(int max){ arr = new long[max]; } //插入数据 public void insert(long value){ arr[elems] = value; elems++; } //显示数据 public void display(){ for(int i = 0; i < elems; i++){ System.out.print(arr[i] + " "); } System.out.println(); } //冒泡排序 public void bubSort(){ long temp = 0L; for(int i = 0; i < elems - 1; i++){ for(int j = 0; j < elems - i - 1; j++){ if(arr[j] > arr[j + 1]){ temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } //选择排序 public void selectSort(){ for(int i = 0; i < elems - 1; i++){ long temp = 0L; int min = i; for(int j = i + 1; j < elems; j++){ if(arr[j] < arr[min]){ min = j; } } temp = arr[i]; arr[i] = arr[min]; arr[min] = temp; } } //插入排序 public void insertSort(){ long select = 0L; for(int i = 1; i < elems; i++){ select = arr[i]; int j = 0; for(j = i; j > 0 && arr[j - 1] >= select; j--){ arr[j] = arr[j - 1]; } arr[j] = select; } } }
package ch02Sort; public class TestSortArray { public static void main(String[] args) { SortArray sort = new SortArray(); sort.insert(35); sort.insert(13); sort.insert(64); sort.insert(85); sort.insert(44); sort.insert(24); sort.display(); sort.bubSort(); //冒泡排序 //sort.selectSort(); //选择排序 //sort.insertSort(); //插入排序 sort.display(); } }
对象:
package ch02Sort; public class Student { //学号 private int stuNo; //姓名 private String name; //性别 private String sex; //年龄 private int age; //构造函数 public Student(int stuNo, String name, String sex, int age) { this.stuNo = stuNo; this.name = name; this.sex = sex; this.age = age; } public void display(){ System.out.println("学号:" + stuNo + ",姓名:" + name + ",性别:" + sex + ",年龄:" + age); } public int getStuNo() { return stuNo; } public void setStuNo(int stuNo) { this.stuNo = stuNo; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package ch02Sort; public class StudentArray { //数组 private Student[] arr; //有效长度 private int elems; //默认构造方法 public StudentArray(){ arr = new Student[50]; } public StudentArray(int max){ arr = new Student[max]; } //插入数据 public void insert(Student student){ arr[elems] = student; elems++; } //显示数据 public void display(){ for(int i = 0; i < elems; i++) arr[i].display(); } //按学号冒泡排序 public void bubSortByStuNo(){ Student temp = null; for(int i = 0; i < elems - 1; i++){ for(int j = 0; j < elems - i - 1; j++){ if(arr[j].getStuNo() > arr[j + 1].getStuNo()){ temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } //按姓名冒泡排序 public void bubSortByName(){ Student temp = null; for(int i = 0; i < elems - 1; i++){ for(int j = 0; j < elems - i - 1; j++){ if(arr[j].getName().compareTo(arr[j + 1].getName()) > 0){ temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } //按学号选择排序 public void selectSortByStuNo(){ for(int i = 0; i < elems - 1; i++){ Student temp = null; int min = i; for(int j = i + 1; j < elems; j++){ if(arr[j].getStuNo() < arr[min].getStuNo()){ min = j; } } temp = arr[i]; arr[i] = arr[min]; arr[min] = temp; } } //按姓名选择排序 public void selectSortByName(){ for(int i = 0; i < elems - 1; i++){ Student temp = null; int min = i; for(int j = i + 1; j < elems; j++){ if(arr[j].getName().compareTo(arr[min].getName()) < 0){ min = j; } } temp = arr[i]; arr[i] = arr[min]; arr[min] = temp; } } //按学号插入排序 public void insertSortByStuNo(){ Student select = null; for(int i = 1; i < elems; i++){ select = arr[i]; int j = 0; for(j = i; j > 0 && arr[j - 1].getStuNo() >= select.getStuNo(); j--){ arr[j] = arr[j - 1]; } arr[j] = select; } } //按姓名插入排序 public void insertSortByName(){ Student select = null; for(int i = 1; i < elems; i++){ select = arr[i]; int j = 0; for(j = i; j > 0 && arr[j - 1].getName().compareTo(select.getName()) > 0; j--){ arr[j] = arr[j - 1]; } arr[j] = select; } } }
package ch02Sort; public class TestStudentArray { public static void main(String[] args) { StudentArray sArray = new StudentArray(); Student stu1 = new Student(509302, "a张三", "男", 20); Student stu2 = new Student(452305, "c李四", "男", 30); Student stu3 = new Student(609507, "d王五", "女", 23); Student stu4 = new Student(535648, "b赵六", "男", 25); sArray.insert(stu1); sArray.insert(stu2); sArray.insert(stu3); sArray.insert(stu4); //按学号排序 sArray.bubSortByStuNo(); //按学号冒泡排序 //sArray.selectSortByStuNo(); //按学号选择排序 //sArray.insertSortByStuNo(); //按学号插入排序 sArray.display(); System.out.println("-------------------------------"); //按姓名排序 sArray.bubSortByName(); //按姓名冒泡排序 //sArray.selectSortByName(); //按姓名选择排序 //sArray.insertSortByName(); //按姓名插入排序 sArray.display(); } }