冒泡排序法:
相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处(每比较完一趟,就选出一个最大值放到了后面),同理继续可以得到一个排好序的数组。
图解:直接上代码:
@Test public void bubbleSort() { int[] arr = { 2, 3, 445, 545, 11 }; //原始数组 int temp; for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { //前一个比后一个大就交换 temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } //或者 @Test public void bubbleSort2() { int[] arr = { 2, 3, 445, 545, 11 }; //原始数组 int temp; for (int i = arr.length - 1; i > 0; 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; } } } for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } }
冒泡排序的缺点:每次发现后一个数比前一个数大都会交换一次,
避免这个缺点的就用下面介绍的选着排序法。、
选择排序法:
排序原理:每次选择出未排好序的列表中最小的数,然后和未排序好的列表中的第一个数进行交换。
直接上代码:
//选择排序法 @Test public void selectionSort() { int[] arr = {112, 23, 44, 4, 312}; int temp; //用于交换的临时变量 int min; //用来记录每次最小值的数组下标 for (int i = 0; i < arr.length-1; i++) { min = i; for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[min]) { min = j; } } //判断是否找到有比这一轮排序的第一个数还小的 if (min != i) { temp = arr[min]; arr[min] = arr[i]; arr[i] = temp; } } //打印 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }
总结:相比冒泡排序法,选择排序法找到比当前值小的值后不用立即交换,
只是记录下来这个值的数组下标索引,等到这轮查找完毕以后再判断目标值
是否是这轮的起始值是否做交换。从这方面来看选择排序相比冒泡法排序效率稍微高。