冒泡排序
1:比较相邻的元素。如果第一个比第二个大,就交换它们两个的位置;
2:对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数
3:针对所有的元素重复以上的步骤,除了最后一个;
4:重复步骤1~3,直到排序完成。
特点:
每轮把最大的往后面放
第一轮把最大的数放在最后
第二轮把第二大的数放在倒数第二个
以此类推
public static void bubbleSort1(int[] array) {int len = array.length;if (len <= 1) {return;}//开始冒泡for (int i = 0; i < len; i++) {for (int j = 0; j < len - i - 1; j++) {//判断前后数据是否需要交换 如果前一个数据大于后一个数据则进行交换否则不交换if (array[j] > array[j + 1]) {int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}}}
改良版
效率改良版,如果数组已经排好序了,不需要数据交换了,直接可以提前结束了
public static void bubbleSort2(int[] array) {int len = array.length;if (len <= 1) {return;}//开始冒泡for (int i = 0; i < len; i++) {//是否需要提前结束冒泡的标识boolean flag = true;for (int j = 0; j < len - i - 1; j++) {//判断前后数据是否需要交换 如果前一个数据大于后一个数据则进行交换否则不交换if (array[j] > array[j + 1]) {int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;flag = false;}}if (flag) {return;}}}
插入排序
1:从第一个元素开始,该元素可以认为已经被排序;
2:取出下一个元素,以当前元素的位置为基准从后向前扫描;
3:如果该元素(已排序)大于新元素,将该元素移到下一位置;
4:重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
5:将新元素插入到该位置后;
6:重复步骤2~5。
特点:第 i 轮会把前 i 个数排好序
public static void insertion(int[] arr) {if (arr.length <= 1) {return;}for (int i = 0; i < arr.length; i++) {for (int j = i; j > 0; j--) {if (arr[j] < arr[j - 1]) {int temp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = temp;}}}}
选择排序
把最小的元素拿出来
特点:
每一轮把为排序的最小数放在前面
第一轮把最小的数放在第一个
第二轮把第二小的数放在第二个
以此类推
public static void selection(int[] arr) {if (arr.length <= 1) {return;}for (int i = 0; i < arr.length; i++) {//当前最小数的下标int minPos = i;for (int j = i + 1; j < arr.length; j++) {//获得未排序的最小数下标minPos = arr[minPos] < arr[j] ? minPos : j;}//最小数和当前下标的数交换位置int temp = arr[i];arr[i] = arr[minPos];arr[minPos] = temp;}}
