# 冒泡排序
public static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
}
//System.out.println(Arrays.toString(arr));
}
# 插入排序
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。
如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法。
算法适用于少量数据的排序,时间复杂度O(n^2)。
public static void insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int value = arr[i];
int j = i - 1;
for (; j > 0; j--) {
if (arr[j] > value) {
arr[j + 1] = arr[j];
continue;
}
break;
}
arr[j] = value;
}
//System.out.println(Arrays.toString(arr));
}
# 选择排序
选择排序(Selection sort)是一种简单直观的排序算法。
它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。
以此类推,直到全部待排序的数据元素的个数为零。 选择排序是不稳定的排序方法。
public static void selectionSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
int k = 0;
int min = Integer.MAX_VALUE;
for (int j = i; j < arr.length; j++) {
if (arr[j] < min) {
k = j;
min = arr[j];
}
}
arr[k] = arr[i];
arr[i] = min;
}
//System.out.println(Arrays.toString(arr));
}
# 归并排序
public static void mergeSort(int[] arr) {
System.out.println(Arrays.toString(arr));
sub_merge(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
private static void sub_merge(int[] arr, int l, int r) {
if (l >= r) {
return ;
}
int c = (l + r) / 2;
sub_merge(arr, l, c);
sub_merge(arr, c + 1, r);
merge(arr, l, c + 1, r);
}
private static void merge(int[] arr, int l, int c, int r) {
int[] leftArr = new int[c - l];
int[] rightArr = new int[r - c + 1];
for(int i = l ; i < c ; i ++) {
leftArr[i - l] = arr[i];
}
for (int i = c ; i <= r ; i ++) {
rightArr[i - c] = arr[i];
}
int i = 0;
int j = 0;
int k = l;
while (i < leftArr.length && j < rightArr.length) {
if (leftArr[i] < rightArr[j]) {
arr[k++] = leftArr[i++];
continue;
}
arr[k++] = rightArr[j++];
}
while (i < leftArr.length) {
arr[k++] = leftArr[i++];
}
while (j < rightArr.length) {
arr[k++] = rightArr[j++];
}
}
# 快速排序
private static void subQuickSort(int[] arr, int p, int r) {
if (p >= r) {
return;
}
int pivot = partition(arr, p, r);
subQuickSort(arr, p, pivot - 1);
subQuickSort(arr, pivot + 1, r);
}
private static int partition(int[] arr, int p, int r) {
int i = p;
int pivot = arr[r];
for (int j = i; j < r; j++) {
if (arr[j] < pivot) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
i ++;
}
}
int temp = arr[i];
arr[i] = arr [r];
arr[r] = temp;
return i;
}
# 二分查找
public int binarySearch(int[] arr, int v) {
int l = 0;
int r = arr.length - 1;
while (l <= r) {
int mid = (l + r) / 2;
if (arr[mid] == v)
return mid;
else if (arr[mid] < v)
l = mid + 1;
else if (arr[mid] > v)
r = mid - 1;
}
return -1;
}