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; } } }