Java中有兩種常用的排序算法:快速排序和歸并排序。它們都是基于分治思想,可以在較短時間內對大型數據集進行排序。
快速排序
快速排序是一種不穩定的排序算法,它的基本思路是選擇一個中間值,將數組分成兩個子數組,一個子數組的所有值都比中間值小,另一個子數組的所有值都比中間值大。然后遞歸地對子數組進行排序,最后將子數組合并起來。
public static void quickSort(int[] arr, int left, int right) { if (left< right) { int pivot = partition(arr, left, right); quickSort(arr, left, pivot - 1); quickSort(arr, pivot + 1, right); } } private static int partition(int[] arr, int left, int right) { int pivot = arr[right]; int i = left - 1; for (int j = left; j< right; j++) { if (arr[j]< pivot) { i++; int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int temp = arr[i + 1]; arr[i + 1] = arr[right]; arr[right] = temp; return i + 1; }
歸并排序
歸并排序是一種穩定的排序算法,它的基本思路是將數組劃分成若干個子數組,然后遞歸地對子數組進行排序,最后將子數組合并起來。對于兩個已排序的子數組,可以用雙指針的方法將它們合并。
public static void mergeSort(int[] arr, int left, int right) { if (left< right) { int mid = (left + right) / 2; mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); merge(arr, left, mid, right); } } private static void merge(int[] arr, int left, int mid, int right) { int[] temp = new int[right - left + 1]; int i = left, j = mid + 1, k = 0; while (i<= mid && j<= right) { if (arr[i]<= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i<= mid) { temp[k++] = arr[i++]; } while (j<= right) { temp[k++] = arr[j++]; } for (int p = 0; p< temp.length; p++) { arr[left + p] = temp[p]; } }
快速排序的平均時間復雜度為O(nlogn),最壞時間復雜度為O(n^2);歸并排序的平均時間復雜度為O(nlogn),最壞時間復雜度也為O(nlogn)。因為快速排序的實現比歸并排序簡單,所以在實際應用中更常用。
下一篇css3動畫out