1. 插入排序:
核心思想:将第 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. 冒泡排序:
核心思想:对比相邻的数字,较大的数字放到后面
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.归并排序:
核心思想:递归+合并,分治思想。将数组分割成两个有序数组,并合并这两个数组。
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. 快速排序
核心思想:分治法,先“治理”,后“拆分”。选出基准值,用挖坑填坑法治理。递归再治理。
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;
}
}
}