排序应用
应用广泛:一旦建立数据库后,就可能根据某些需求对它进行排序。比如,对员工按工资排序,对学生按年级排序,对商品按价格排序,对城市按人口增长率排序,对国家按GDP排序,以及对恒星按大小排序。
重要性:由于排序非常重要而且可能非常耗时,所以它已经成为计算机科学中一个被广泛研究的课题。
排序的稳定性:如果具有相同关键字的数据项,经过排序它们的顺序保持不变,这样的排序就是稳定的。
冒泡排序
概述:冒泡排序算法最简单,但效率最低。
算法:1和2比较,2和3比较,3和4比较...,把最大的逐步冒泡到最顶端。
效率:
比较次数:
假如一共有5个人比较高低,一共要比较4轮,第一轮要比较4次,第二轮比较3次,第三轮比较2次,第四轮比较1次,总共需要比较4+3+2+1次。
这是一个有序数列,公式为(N-1+1)*(N-1)/2,即N*(N-1)/2,忽略1,N2/2
交换次数:
如果数字是随机的,大概有一半数据需要交换,即N2/4
交换和比较次数都和N2成正比,所以用大O表示法,冒泡排序表示为O(N2)
无论何时,只要看到双层循环,就可以怀疑这个算法的运行时间是O(N2)。外层循环N次,内部循环每次执行N次或几分之N次,这就意味着将大约需要N2次基本操作。
int arrLength = arr.length; int temp = 0; // 假设一共有5个人比较个子高低 // i的取值为最后一个需要比较大小的元素 // 第一个轮回最后一次比较的两个数的第二个数的下标是4 // 第二个轮回最后一次比较的两个数的第二个数的下标是3 // 第三个轮回最后一次比较的两个数的第二个数的下标是2 // 第四个轮回最后一次比较的两个数的第二个数的下标是1 for (int i = arrLength - 1; i > 0; i--) { // 每一个轮回总是1和2比较,2和3比较,3和4比较...,所以j=0 // 因为后面是j和j+1比较,所以j的最大取值范围是这一轮回最后一次比较时两个数的第一个数,也就是j < i for (int j = 0; j < i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } }
package MyTest; import java.util.Arrays; import java.util.Random; public class OrderArray { public static void main(String[] args) { int[] arr = new int[]{100, 99, 56, 78, 50}; //fill(arr); print(arr); println(); sort(arr); print(arr); } private static void println() { System.out.println(); } static void sort(int[] arr) { int arrLength = arr.length; int temp = 0; // 假设一共有5个人比较个子高低 // i的取值为最后一个需要比较大小的元素 // 第一个轮回最后一次比较的两个数的第二个数的下标是4 // 第二个轮回最后一次比较的两个数的第二个数的下标是3 // 第三个轮回最后一次比较的两个数的第二个数的下标是2 // 第四个轮回最后一次比较的两个数的第二个数的下标是1 for (int i = arrLength - 1; i > 0; i--) { // 每一个轮回总是1和2比较,2和3比较,3和4比较...,所以j=0 // 因为后面是j和j+1比较,所以j的最大取值范围是这一轮回最后一次比较时两个数的第一个数,也就是j < i for (int j = 0; j < i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } static void fill(int[] arr) { Random random = new Random(); for (int i = 0; i < 100; i++) { int num = random.nextInt(100); arr[i] = num; } } static void print(int[] arr) { for (int i = 0; i < 5; i++) { System.out.print(arr[i] + " | "); } } }