一 排序算法
1.1 冒泡排序
public void maoPaoSort(int[] arr) {
if (arr.length < 2) {
return;
}
for (int i = arr.length; i > 0; i--) {
for (int j = 0; j < i - 1; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
}
1.2 选择排序
public void selectSort(int[] arr) {
if (arr.length < 2) {
return;
}
for (int i = 0; i < arr.length - 1; i++) {
int index = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[index] > arr[j]) {
index = j;
}
}
swap(arr, i, index);
}
}
1.3 插入排序
public void selectSort(int[] arr) {
if (arr.length < 2) {
return;
}
for (int i = 0; i < arr.length - 1; i++) {
int index = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[index] > arr[j]) {
index = j;
}
}
swap(arr, i, index);
}
}
1.4 归并排序
public void guiBingSort(int[] arr, int left, int right) {
if (left == right) {
return;
}
int mid = left + (right - left) >> 1;
guiBingSort(arr, left, mid);
guiBingSort(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, index = 0;
while (i <= mid && j <= right) {
temp[index++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
}
while (i <= mid) {
temp[index++] = arr[i++];
}
while (j <= right) {
temp[index++] = arr[j++];
}
for (i = 0; i < temp.length; i++) {
arr[left++] = temp[i];
}
}
1.5 快速排序
public void quickSort(int[] arr, int left, int right) {
if (left == right) {
return;
}
int[] mid = partition(arr, left, right);
quickSort(arr, left, mid[0]);
quickSort(arr, mid[1], right);
}
private int[] partition(int[] arr, int left, int right) {
int index = left, L = left - 1, R = right, num = arr[right - 1];
while (index < R) {
if (arr[index] < num) {
swap(arr, index++, ++L);
} else if (arr[index] > num) {
swap(arr, index, --R);
} else {
index++;
}
}
return new int[] { L + 1, R };
}
1.6 堆排序
public void heapSort(int[] arr) {
if (arr.length < 2) {
return;
}
createHeap(arr, arr.length);
for (int i = 0; i < arr.length - 1; i++) {
swap(arr, 0, arr.length - 1 - i);
heapify(arr, 0, arr.length - 1 - i);
}
}
private static void heapify(int[] arr, int index, int heapSize) {
if (index < heapSize && (2 * index + 1) < heapSize) {
if (2 * index + 2 < heapSize) {
if (arr[2 * index + 1] > arr[index] || arr[2 * index + 2] > arr[index]) {
int maxIndex = arr[2 * index + 1] > arr[2 * index + 2] ? 2 * index + 1 : 2 * index + 2;
swap(arr, index, maxIndex);
}
} else {
if (arr[2 * index + 1] > arr[index]) {
swap(arr, index, 2 * index + 1);
}
}
}
}
private static void createHeap(int[] arr, int heapSize) {
for (int i = 1; i < heapSize; i++) {
int j = i;
while (j > 0) {
if (arr[j] > arr[(j - 1) / 2]) {
swap(arr, j, (j - 1) / 2);
j = (j - 1) / 2;
} else {
break;
}
}
}
}
二 排序算法耗时及时间复杂度、稳定性

image.png