1 冒泡排序
package com.xianhuii.sort; import org.junit.Test; import java.util.Arrays; public class BubbleSort { private void swap(int[] arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } public void sort(int[] arr) { int len = arr.length; boolean flag; for (int i = 1; i < len; i++) { flag = false; for (int j = 0; j < len - i; j++) { if (arr[j] > arr[j + 1]) { flag = true; swap(arr, j, j + 1); } } if (!flag) { break; } } } @Test public void test() { int[] arr = new int[]{4, 5, 6, 3, 2, 1}; sort(arr); System.out.println(Arrays.toString(arr)); } }
2 选择排序
package com.xianhuii.sort; import org.junit.Test; import java.util.Arrays; public class SelectSort { private void swap(int[] arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } public void sort(int[] arr) { int len = arr.length; int minIndex = 0; for (int i = 0; i < len - 1; i++) { minIndex = i; for (int j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } if (minIndex != i) { swap(arr, i, minIndex); } } } @Test public void test() { int[] arr = new int[]{4, 5, 6, 3, 2, 1}; sort(arr); System.out.println(Arrays.toString(arr)); } }
3 插入排序
package com.xianhuii.sort; import org.junit.Test; import java.util.Arrays; public class InsertSort { private void insert(int[] arr, int index) { int len = index - 1; int target = arr[index]; for (int i = len; i >= 0; i--) { if (arr[i] > target) { arr[i + 1] = arr[i]; index = i; } else { break; } } if (index != (len + 1)) { arr[index] = target; } } public void sort(int[] arr) { int len = arr.length; for (int i = 1; i < len; i++) { insert(arr, i); } } @Test public void test() { int[] arr = new int[]{4, 5, 6, 3, 2, 1}; sort(arr); System.out.println(Arrays.toString(arr)); } }
4 希尔排序
package com.xianhuii.sort; import org.junit.Test; import java.util.Arrays; public class ShellSort { private void insert(int[] arr, int index, int gap) { int len = index - gap; int target = arr[index]; for (int i = len; i >= 0; i -= gap) { if (arr[i] > target) { arr[i + gap] = arr[i]; index = i; } else { break; } } if (index != (len + gap)) { arr[index] = target; } } private void insertSort(int[] arr, int gap) { int len = arr.length; for (int i = 1; i < len; i++) { insert(arr, i, gap); } } public void sort(int[] arr) { int len = arr.length; for (int gap = len / 2; gap >= 1; gap /= 2) { insertSort(arr, gap); } } @Test public void test() { int[] arr = new int[]{8, 9, 1, 7, 6, 5, 3, 4, 2, 0}; sort(arr); System.out.println(Arrays.toString(arr)); } }
5 快速排序
package com.xianhuii.sort; import org.junit.Test; import java.util.Arrays; public class QuickSort { private void swap(int[] arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } private int partition(int[] arr, int left, int right, int pivot) { while (left < right) { while (arr[left] < pivot) { left++; } while (arr[right] > pivot) { right--; } if (left < right) { swap(arr, left, right); } } return left; } private void sort(int[] arr, int left, int right) { if (left >= right || (left + 1 == right && arr[left] < arr[right])) { return; } int pivot = arr[(left + right) / 2]; int index = partition(arr, left, right, pivot); sort(arr, left, index - 1); sort(arr, index, right); } public void sort(int[] arr) { sort(arr, 0, arr.length - 1); } @Test public void test() { int[] arr = new int[]{4, 3, 0, 2, 7, 1, 6, 5}; sort(arr); System.out.println(Arrays.toString(arr)); } }
6 归并排序
package com.xianhuii.sort; import org.junit.Test; import java.util.Arrays; public class MergeSort { private void merge(int[] arr, int left, int right) { int[] tmp = new int[right - left + 1]; int index = 0; int mid = (left + right) >> 1; int l = left; int r = mid + 1; while (l <= mid && r <= right) { if (arr[l] < arr[r]) { tmp[index++] = arr[l++]; } else { tmp[index++] = arr[r++]; } } while (l <= mid) { tmp[index++] = arr[l++]; } while (r <= right) { tmp[index++] = arr[r++]; } index = 0; while (left <= right) { arr[left++] = tmp[index++]; } } private void sort(int[] arr, int left, int right) { int mid = (left + right) >> 1; if (left < right) { sort(arr, left, mid); sort(arr, mid + 1, right); merge(arr, left, right); } } public void sort(int[] arr) { sort(arr, 0, arr.length - 1); } @Test public void test() { int[] arr = new int[]{11, 8, 3, 9, 7, 1, 2, 5}; sort(arr); System.out.println(Arrays.toString(arr)); } }
7 基数排序
package com.xianhuii.sort; import org.junit.Test; import java.util.Arrays; public class RadixSort { public void sort(int[] arr) { int length = arr.length; int maxIndex = 0; // 最大值索引 int[][] bucket = new int[10][length]; // 桶 int[] count = new int[10]; // 记录放入个数 int radix = 0; for (int i = 1; i < length; i++) { // 寻找最大值 if (arr[i] > arr[maxIndex]) { maxIndex = i; } } int numLen = (arr[maxIndex] + "").length(); // 求出最大值的位数 for (int i = 0, m = 1; i < numLen; i++, m *= 10) { for (int j = 0; j < length; j++) { // 按顺序入桶 radix = arr[j] / m % 10; bucket[radix][count[radix]++] = arr[j]; } int index = 0; for (int k = 0; k < bucket.length; k++) { // 按顺序出桶 if (count[k] != 0) { for (int j = 0; j < count[k]; j++) { arr[index++] = bucket[k][j]; } count[k] = 0; } } } } @Test public void test() { int[] arr = new int[]{53, 542, 3, 63, 14, 214, 154, 748, 616}; sort(arr); System.out.println(Arrays.toString(arr)); } }