publicint[] selectSort(int[] nums) { int n = nums.length; // 从第一个开始,执行到倒数第二个 for (int i = 0; i < n - 1; i++) { int minIndex = i; for (int j = i + 1; j < n; j++) { if (nums[minIndex] > nums[j]) { minIndex = j; } } swap(nums, i, minIndex); } return nums; }
冒泡排序
相邻比较,最小的升到最前面
(这个 gif 是反过来的,最大的挪到最后)
1 2 3 4 5 6 7 8 9 10 11 12
publicint[] bubbleSort(int[] nums) { int n = nums.length; for (int i = 0; i < n; i++) { // 从倒数第一个开始,执行到第i+1个 for (int j = n - 1; j > i; j--) { if (nums[j] < nums[j - 1]) { swap(nums, j, j - 1); } } } return nums; }
插入排序
每个数字一路往前交换,等效为插入
1 2 3 4 5 6 7 8 9 10
publicint[] insertSort(int[] nums) { int n = nums.length; for (int i = 1; i < n; i++) { // 从第二个开始,每个数字一路往前交换,直到前面比它小为止 for (int j = i; j > 0 && nums[j] < nums[j - 1]; j--) { swap(nums, j, j - 1); } } return nums; }
privatevoiddoQuickSort(int[] nums, int l, int h){ if (l < h) { // mid左边都是小于等于它的数字,右边都是大于等于它的数字 int mid = partition(nums, l, h); doQuickSort(nums, l, mid - 1); doQuickSort(nums, mid + 1, h); } }
privateintpartition(int[] nums, int l, int h){ // 取第一个数作为比较基础 int target = nums[l]; int i = l, j = h + 1; while (i < j) { // 左 -> 右 找更大的数 while (++i != h && nums[i] < target) ; // 左 <- 右 找更小的数 while (--j != l && nums[j] > target) ; if (i < j) { swap(nums, i, j); } } // 此时 i>j 要跟坐标小的交换,并返回这个小坐标 swap(nums, l, j); return j; }