冒泡排序
时间复杂度: O(n ^ 2)
稳定性:稳定
每次把两个相邻数进行比较,大的那个换到后面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public void bubbleSort(int[] arr) { int length = arr.length; for (int i = 0; i < length - 1; i++) { for (int j = 0; j < length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { swap(arr, j, j + 1); } } } }
private void swap(int[] arr, int i, int j) { int temp = arr[j]; arr[j] = arr[i]; arr[i] = temp; }
|
选择排序
时间复杂度: O(n ^ 2)
稳定性:稳定
每次遍历数组选出一个最小(大)的放到数组前面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public void SelectionSort(int[] arr) { int length = arr.length; for (int i = 0; i < length - 1; i++) { int minIndex = i; for (int j = i + 1; j < length; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } swap(arr, minIndex, i); } }
|
插入排序
时间复杂度: O(n ^ 2)
稳定性:稳定
每次从当前位置往前比较,找到合适的插入位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public void InsertSort(int[] arr) { int length = arr.length; for (int i = 1; i < length; i++) { int temp = arr[i]; int j = i; while (j > 0 && temp < arr[j - 1]) { arr[j] = arr[j - 1]; j--; } arr[j] = temp; } }
|
快速排序
时间复杂度: O(n * logn)
稳定性:不稳定
自上而下,递归子问题,根据pivot把数据分成三个区间
- 小于 pivot
- pivot
- 大于 pivot
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public void quickSort(int[] arr) { quickSort(arr, 0, arr.length - 1); }
public void quickSort(int[] arr, int left, int right) { if (left > right) return; int partitionIndex = partition(arr, left, right); quickSort(arr, left, partitionIndex - 1); quickSort(arr, partitionIndex + 1, right); }
private int partition(int[] arr, int left, int right) { int pivot = left; int index = pivot + 1; for (int i = index; i <= right; i++) { if(arr[i] < arr[pivot]){ swap(arr, i, index); index++; } } swap(arr, pivot, index - 1); return index - 1; }
|
归并排序
时间复杂度: O(n * logn)
稳定性:稳定
自上而下的递归子问题,用小问题解决大问题
自下而上的适合链表,先归并短的链表,再归并长的链表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| private int[] MergeSort(int[] arr) { return MergeSort(arr, 0, arr.length - 1); }
private int[] MergeSort(int[] arr, int left, int right) { if(left > right) return null; if(left == right) return new int[]{arr[left]}; int mid = (left + right) / 2; return merge(MergeSort(arr, left, mid), MergeSort(arr, mid + 1, right)); }
private int[] merge(int[] arr1, int[] arr2) { int[] result = new int[arr1.length + arr2.length]; int index = 0; int p1 = 0, p2 = 0; while (p1 < arr1.length && p2 < arr2.length) { int num; if (arr1[p1] < arr2[p2]) { num = arr1[p1++]; } else { num = arr2[p2++]; } result[index++] = num; } while (p1 < arr1.length) { result[index++] = arr1[p1++]; } while (p2 < arr2.length) { result[index++] = arr2[p2++]; } return result; }
|