整体上,排序分
非线性时间比较类排序:交换类排序(快速排序和冒泡排序)、插入类排序(简单插入排序和希尔排序)、选择类排序(简单选择排序和堆排序)、归并排序(二路归并排序和多路归并排序);
线性时间非比较类排序:计数排序、基数排序和桶排序。
主要参考白话经典排序系列http://blog.csdn.net/morewindows/article/details/7961256,整理为JAVA相关适配
冒泡:
注意与http://blog.csdn.net/morewindows/article/details/6657829的区别。
/** * Created by superdaojian on 17/12/20. */ public class BubbleSort { //从小到大,每次把较大的放到右侧 public static void simpleBubbleSort(int[] arr) { int len = arr.length; for (int i = 0; i < len; i++) { for (int j = 0; j < len - i - 1; j++) { if (arr[j] > arr[j + 1]) { swap(arr, j, j + 1); } } } } //升级版,某趟排序没有发生交换,说明已经有序 public static void juniorBubbleSort(int[] arr) { int len = arr.length; boolean flag; for (int i = 0; i < len; i++) { flag = false; for (int j = 0; j < len - i - 1; j++) { if (arr[j] > arr[j + 1]) { swap(arr, j, j + 1); flag = true; } } if(!flag){ break; } } } //高级版,某趟排序最后发生交换的位置,说明下次从头至此位置遍历即可 public static void seniorBubbleSort(int[] arr) { int len = arr.length; int flagNum = len; for (int i = 0; i < flagNum; i++) { i = 0; int tempFlagNum = flagNum; for (int j = 0; j < tempFlagNum - i - 1; j++) { if (arr[j] > arr[j + 1]) { swap(arr, j, j + 1); flagNum = j + 1; } } } } public static void swap(int[] arr, int i, int j) { arr[i] ^= arr[j]; arr[j] ^= arr[i]; arr[i] ^= arr[j]; } public static void main(String[] args) { int[] arr = new int[]{1, 2, 5, -1, -2, 8}; printAllNum(arr); seniorBubbleSort(arr); printAllNum(arr); } public static void printAllNum(int[] arr) { for (int i : arr) { System.out.println(i); } } }