排序分類:內部排序和外部排序算法
內部排序:只使用內存 外部排序:內存和空間結合使用數組
內部排序:一、插入排序(直接插入排序、希爾排序) 二、選擇排序(簡單選擇排序、堆排序) 三、交換排序(冒泡排序、快速排序)四、歸併排序 五、分配排序(箱排序、基數排序)ui
所需輔助空間最多:歸併排序 所需輔助空間最小:堆排序 平均速度最快: 快速排序 不穩定: 快速排序、希爾排序、堆排序code
選擇排序算法根據如下三點來選擇排序算法: 一、數據的模塊 二、數據的類型 三、數據已有的順序排序
當規模較小時選擇直接插入排序或者冒泡排序,當數據量較小時候對於任何算法來講體現不出來差別性。 若是全是正整數優先選擇桶排序 當數據已有順序,選擇冒泡排序,若是是大量的隨機數據選擇快速排序(不穩定)。遞歸
各類排序的實現: 1)冒泡排序內存
public static int[] BubbleSort(int[] data) { boolean flag = true; for (int i = 0; i < data.length && flag; i++) { flag = false; for (int j = 0; j < data.length - i - 1; j++) { if (data[j] > data[j + 1]) { int tmp = data[j]; data[j] = data[j + 1]; data[j + 1] = tmp; flag = true; } } } return data; }
2)快速排序get
public static int[] quickSort(int[] data) { if (data.length > 0) { quickSortCore(data, 0, data.length - 1); } return data; } private static void quickSortCore(int[] list, int low, int high) { if (low < high) { int middle = getMiddle(list, low, high); // 將list數組進行一分爲二 quickSortCore(list, low, middle - 1); // 對低字表進行遞歸排序 quickSortCore(list, middle + 1, high); // 對高字表進行遞歸排序 } } private static int getMiddle(int[] list, int low, int high) { int tmp = list[low]; // 數組的第一個做爲中軸 while (low < high) { while (low < high && list[high] >= tmp) { high--; } list[low] = list[high]; // 比中軸小的記錄移到低端 while (low < high && list[low] <= tmp) { low++; } list[high] = list[low]; // 比中軸大的記錄移到高端 } list[low] = tmp; // 中軸記錄到尾 return low; // 返回中軸的位置 }