private static void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
冒泡排序
public static void bubbleSort(int[] nums) {
int len = nums.length;
boolean flag = true;
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - 1 - i; j++) {
if (nums[j] > nums[j + 1]) {
swap(nums, j, j + 1);
flag = false;
}
}
if (flag) break;
}
}
选择排序
public static void selectSort(int[] nums) {
int len = nums.length;
for (int i = len - 1; i > 0; i--) {
int maxValueIndex = 0;
for (int j = 1; j <= i; j++) {
if (nums[maxValueIndex] < nums[j]) {
maxValueIndex = j;
}
}
if (maxValueIndex != i) {
swap(nums, maxValueIndex, i);
}
}
}
插入排序
public static void insertionSort(int[] nums) {
int len = nums.length;
for (int i = 1; i < len; i++) {
int insertValue = nums[i];
int j = i - 1;
while (j >= 0 && nums[j] > insertValue) {
nums[j + 1] = nums[j];
j--;
}
nums[j + 1] = insertValue;
}
}
希尔排序
public static void shellSort(int[] nums) {
int len = nums.length;
int gap = len / 2;
while (gap > 0) {
for (int i = gap; i < len; i++) {
int insertValue = nums[i];
int j = i - gap;
while (j >= 0 && nums[j] > insertValue) {
nums[j + gap] = nums[j];
j -= gap;
}
nums[j + gap] = insertValue;
}
gap /= 2;
}
}
计数排序
public static void countingSort(int[] nums) {
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for (int i : nums) {
if (i < min) min = i;
if (i > max) max = i;
}
int[] record = new int[max - min + 1];
int offset = -min;
for (int i : nums) {
record[i + offset]++;
}
for (int i = 0, j = 0; i < record.length; i++) {
while (record[i] > 0) {
nums[j++] = i - offset;
record[i]--;
}
}
}
归并排序
public static void mergeSort(int[] nums) {
int[] temp = new int[nums.length];
split(nums, 0, nums.length - 1, temp);
}
private static void split(int[] nums, int left, int right, int[] temp) {
if (left == right) return;
int mid = (left + right) >>> 1;
split(nums, left, mid, temp);
split(nums, mid + 1, right, temp);
merge(nums, left, mid, mid + 1, right, temp);
System.arraycopy(temp, left, nums, left, right - left + 1);
}
private static void merge(int[] nums, int i, int iEnd, int j, int jEnd, int[] temp) {
int k = i;
while (i <= iEnd && j <= jEnd) {
temp[k++] = nums[i] < nums[j] ? nums[i++] : nums[j++];
}
while (i <= iEnd) temp[k++] = nums[i++];
while (j <= jEnd) temp[k++] = nums[j++];
}
快速排序(优化)
public static void quickSort(int[] nums) {
int len = nums.length;
partition(nums, 0, len - 1);
}
private static void partition(int[] nums, int start, int end) {
if (start >= end) return;
int randomIndex = (int) (Math.random() * (end - start + 1)) + start;
swap(nums, start, randomIndex);
int baseValue = nums[start];
int left = start;
int right = end;
while (left < right) {
while (left < right && nums[right] >= baseValue) right--;
while (left < right && nums[left] <= baseValue) left++;
if (left < right) {
swap(nums, left, right);
}
}
if (left != start) {
swap(nums, left, start);
}
while (left > start && nums[left] == nums[left - 1]) {
left--;
}
while (right < end && nums[right] == nums[right + 1]) {
right++;
}
partition(nums, start, left - 1);
partition(nums, right + 1, end);
}