冒泡排序
public void bubbleSort(int[] nums) {
int len = nums.length;
for (int i = 0; i < len; i++) {
boolean swapped = false;
for (int j = 0; j < len - i - 1; j++) {
if (nums[j] > nums[j + 1]) {
swap(nums, j, j + 1);
swapped = true;
}
}
if (!swapped) break;
}
}
直接插入排序
public void insertSort(int[] nums) {
int len = nums.length;
for (int i = 1; i < len; i++) {
int num = nums[i];
int j = i - 1;
while (j >= 0 && nums[j] > num) {
nums[j + 1] = nums[j];
j--;
}
nums[j + 1] = num;
}
}
简单选择排序
public void selectSort(int[] nums) {
int len = nums.length;
for (int i = 0; i < len; i++) {
int minIdx = i;
for (int j = i; j < len; j++) {
if (nums[j] < nums[minIdx]) {
minIdx = j;
}
}
swap(nums, i, minIdx);
}
}
希尔排序
public void shellSort(int[] nums) {
int len = nums.length;
int gap = 1;
while (gap < len) gap = gap * 3 + 1;
while (gap >= 1) {
for (int i = gap; i < len; i++) {
int tmp = nums[i];
int j = i - gap;
while (j >= 0 && nums[j] > tmp) {
nums[j + gap] = nums[j];
j -= gap;
}
nums[j + gap] = tmp;
}
gap /= 3;
}
}
归并排序
public void mergeSort(int[] nums) {
mergeSortHelper(nums, 0, nums.length - 1);
}
private void mergeSortHelper(int[] nums, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSortHelper(nums, left, mid);
mergeSortHelper(nums, mid + 1, right);
mergeHelper(nums, left, mid, right);
}
}
private void mergeHelper(int[] nums, int left, int mid, int right) {
int[] tmpArr = new int[nums.length];
int l = left, r = mid + 1, tmpIdx = left;
while (l <= mid && r <= right) {
if (nums[l] <= nums[r]) {
tmpArr[tmpIdx++] = nums[l++];
} else {
tmpArr[tmpIdx++] = nums[r++];
}
}
while (l <= mid) {
tmpArr[tmpIdx++] = nums[l++];
}
while (r <= right) {
tmpArr[tmpIdx++] = nums[r++];
}
while (left <= right) {
nums[left] = tmpArr[left];
left++;
}
}
快速排序
public void quickSort(int[] nums) {
quickSortHelper(nums, 0, nums.length - 1);
}
private void quickSortHelper(int[] nums, int left, int right) {
if (left >= right) return;
int pivotIdx = partition(nums, left, right);
quickSortHelper(nums, left, pivotIdx - 1);
quickSortHelper(nums, pivotIdx + 1, right);
}
private int partition(int[] nums, int left, int right) {
int pivot = nums[left];
int idx = left;
for (int i = left + 1; i <= right; i++) {
if (nums[i] < pivot) {
swap(nums, ++idx, i);
}
}
nums[left] = nums[idx];
nums[idx] = pivot;
return idx;
}
堆排序
public void heapSort(int[] nums) {
int len = nums.length;
buildHeap(nums, len);
for (int i = len - 1; i > 0; i--) {
swap(nums, 0, i);
heapify(nums, 0, i);
}
}
private void buildHeap(int[] nums, int length) {
for (int i = (length - 1 - 1) / 2; i >= 0; i--) {
heapify(nums, i, length);
}
}
private void heapify(int[] nums, int index, int length) {
int leftChild = index * 2 + 1;
int rightChile = index * 2 + 2;
int cur = index;
if (leftChild < length && nums[leftChild] > nums[cur]) {
cur = leftChild;
}
if (rightChile < length && nums[rightChile] > nums[cur]) {
cur = rightChile;
}
if (cur != index) {
swap(nums, cur, index);
heapify(nums, cur, length);
}
}
基数排序
public void radixSort(int[] nums) {
int len = nums.length;
int max = nums[0];
for (int num : nums) {
if (num > max) max = num;
}
int time = 0;
while (max > 0) {
time++;
max /= 10;
}
List<List<Integer>> bucket = new ArrayList<>();
for (int i = 0; i < 10; i++) {
bucket.add(new ArrayList<>());
}
for (int i = 0; i < time; i++) {
for (int j = 0; j < len; j++) {
int digit = nums[j] % (int) Math.pow(10, i + 1) / (int) Math.pow(10, i);
bucket.get(digit).add(nums[j]);
}
int idx = 0;
for (int j = 0; j < 10; j++) {
List<Integer> list = bucket.get(j);
for (int n : list) {
nums[idx++] = n;
}
list.clear();
}
}
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}