1. 插入排序:java
核心思想:將第 i 個數字插入到0 ~ i - 1的有序數列中數組
int a[] = new int[] { 2, 4, 1, 6, 3, 7, 1, 8, 5, 6, 4 }; for(int i = 0; i < a.length; i++) { int tmp = a[i]; int j = i - 1; while( j >= 0 && a[j] > tmp) { a[j + 1] = a[j]; j--; } a[j + 1] = tmp; } for(int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); }
2. 冒泡排序:ui
核心思想:對比相鄰的數字,較大的數字放到後面code
int a[] = new int[] { 2, 4, 1, 6, 3, 7, 1, 8, 1000, 5, 6, 4, -1, 0, 100 }; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a.length - 1 - i; j++) { if (a[j] > a[j + 1]) { int tmp = a[j]; a[j] = a[j + 1]; a[j + 1] = tmp; } } } for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); }
3. 選擇排序:排序
核心思想:從後面序列中找到最小值,交換到有序序列的末尾遞歸
int a[] = new int[] { 2, 4, 1, 6, 3, 7, 1, 8, 5, 6, 4, 0, 100, -1 }; for (int i = 0; i < a.length; i++) { int index = i, min = a[i]; for(int j = i + 1; j < a.length; j++) { if (a[j] < min) { min = a[j]; index = j; } } int tmp = a[i]; a[i] = a[index]; a[index] = tmp; } for(int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); }
4.歸併排序:class
核心思想:遞歸+合併,分治思想。將數組分割成兩個有序數組,併合並這兩個數組。效率
public class MergeSort { public static void main(String[] args) { int a[] = new int[] { 2, 4, 1, 6, 3, 7, 1, 8, 5, 6, 4, 18, -3, -76, 71, 21, 0, 0 }; MergeSort mergeSort = new MergeSort(); mergeSort.mergeSort(a, 0, a.length - 1); for (int i = 0; i < a.length; i++) { System.out.print(a[i]+ " "); } } public void mergeSort(int[] a, int begin, int end) { if (begin < end) { int min = (begin + end) / 2; mergeSort(a, begin, min); mergeSort(a, min + 1, end); merge(a, begin, min, end); } } public void merge(int a[], int begin, int min, int end) { int left[] = new int[min - begin + 1]; int right[] = new int[end - min]; int i = 0, j = 0, k = 0; for (i = begin; i <= end; i++) { if (i <= min) { left[j++] = a[i]; } else { right[k++] = a[i]; } } j = 0; k = 0; i = begin; while (j < left.length && k < right.length) { if (left[j] < right[k]) { a[i++] = left[j++]; } else { a[i++] = right[k++]; } } while (j < left.length) { a[i++] = left[j++]; } while (k < right.length) { a[i++] = right[k++]; } } }
5. 快速排序數據
核心思想:分治法,先「治理」,後「拆分」。選出基準值,用挖坑填坑法治理。遞歸再治理。static
public class QuickSort { public static void main(String[] args) { int a[] = new int[] { 7, 4, 1, 6, 3, 10, 21, 11, -1, -3, 4, 7, 1, 8, 122, 99, 5, 6, 4 }; QuickSort qSort = new QuickSort(); qSort.quickSort(a, 0, a.length - 1); for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } } public void quickSort(int a[], int begin, int end) { if (begin < end) { int tmp = a[begin]; int i = begin, j = end; while (i < j) { while (i < j && a[j] > tmp) { j--; } if (i < j) { a[i++] = a[j]; } while (i < j && a[i] < tmp) { i++; } if (i < j) { a[j--] = a[i]; } } a[i] = tmp; quickSort(a, begin, i - 1); quickSort(a, i + 1, end); } } }
6.希爾排序
核心思想:插入排序在數據基本有序前提下運行效率高。按步長將數組劃分爲多個「子數組」,每一個「子數組」成員間隔爲步長,每一個子數組執行插排。逐漸縮短步長(gap /= 2),再次執行屢次插排,直到步長縮短爲0。
public class ShellSort { public static void main(String[] args) { int a[] = new int[] { 10, 9, 11, 92, 32, 2, 4, 1, 6, 3, 7, 0 ,-2, -7, -9, 11, 1, 8, 5, 6, 4 }; int gap = a.length / 2; while (gap > 0) { for (int i = 0; i < gap; i++) { insert(a, i, gap); } gap /=2; } for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } } public static void insert(int a[], Integer begin, int gap) { /* 插入排序增量爲1,而希爾排序增量爲gap */ for (int i = begin; i < a.length; i += gap) { int tmp = a[i]; int j = i - gap; while (j >= 0 && a[j] > tmp) { a[j + gap] = a[j]; j -= gap; } a[j + gap] = tmp; } } }