package test;
import java.util.Arrays;
/**
* 数组七大排序工具类
* @author 欧阳
* @date 2022/3/14
*/
public class SortUtil {
/**
* 堆排序
* @param arr
*/
public static void heapSort(int[] arr) {
check(arr);
for (int i = arr.length / 2 - 1; i >= 0; i--) { //1.构建大顶堆
heap(arr, i, arr.length); //从第一个非叶子结点从下至上,从右至左调整结构
}
for (int j = arr.length - 1; j > 0; j--) { //2.调整堆结构+交换堆顶元素与末尾元素
swap(arr, 0, j);//将堆顶元素与末尾元素进行交换
heap(arr, 0, j);//重新对堆进行调整
}
}
/**
* 冒泡排序
* @param arr
* @return
*/
public static void bubbleSort(int[] arr) {
check(arr);
for (int i = 1; i < arr.length; i++) {
for (int j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
}
/**
* 归并排序
* @param arr
* @return
*/
public static void mergeSort(int[] arr) {
check(arr);
merge(arr, 0, arr.length - 1);
}
/**
* 选择排序
* @param arr
*/
public static void selectSort(int[] arr) {
check(arr);
int k = 0;
int temp = 0;
for (int i = 0; i < arr.length - 1; i++) {
k = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[k] > arr[j]) {
k = j;
}
}
if (k != i) {
swap(arr, k, i);
}
}
}
/**
* 快速排序
* @param arr
*/
public static void quickSort(int[] arr) {
check(arr);
quick(arr, 0, arr.length - 1);
}
/**
* 插入排序
* @param arr
*/
public static void insertSort(int[] arr) {
check(arr);
for (int i = 0; i < arr.length; i++) {
for (int j = i; j > 0; j--)
if (arr[j] < arr[j - 1]) {
swap(arr, j, j - 1);
} else {
break;
}
}
}
/**
* 希尔排序
* @param arr
*/
public static void shellSort(int[] arr) {
check(arr);
for (int step = arr.length / 2; step > 0; step /= 2) {
for (int i = step; i < arr.length; i++) {
int value = arr[i];
for (int j = i - step; j >= 0 && arr[j] > value; j -= step) {
swap(arr, j, j + step);
}
}
}
}
/**
* 调整大顶堆
*/
public static void heap(int[] arr, int i, int length) {
int temp = arr[i];//先取出当前元素i
for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {//从i结点的左子结点开始,也就是2i+1处开始
if (k + 1 < length && arr[k] < arr[k + 1]) {//如果左子结点小于右子结点,k指向右子结点
k++;
}
if (arr[k] > temp) {//如果子节点大于父节点,将子节点值赋给父节点(不用进行交换)
arr[i] = arr[k];
i = k;
} else {
break;
}
}
arr[i] = temp;//将temp值放到最终的位置
}
private static void merge(int[] arr, int begin, int end) {
if (begin >= end) return;
int mid = (begin + end) / 2;
merge(arr, begin, mid);
merge(arr, mid + 1, end);
int i = begin, j = mid + 1, k = 0;
int[] tmp = new int[end - begin + 1];
while (i <= mid && j <= end) {
if (arr[i] < arr[j]) {
tmp[k++] = arr[i++];
} else {
tmp[k++] = arr[j++];
}
}
while (i <= mid) {
tmp[k++] = arr[i++];
}
while (j <= end) {
tmp[k++] = arr[j++];
}
for (int p = begin; p <= end; p++) {
arr[p] = tmp[p - begin];
}
}
private static void quick(int[] arr, int leftIndex, int rightIndex) {
if (leftIndex < rightIndex) {
int p = arr[leftIndex];
int i = leftIndex;
int j = rightIndex;
while (i < j) {
while (i < j && arr[j] >= p) j--;
if (i < j) {
arr[i] = arr[j];
}
while (i < j && arr[i] < p) i++;
if (i < j) {
arr[j] = arr[i];
}
}
arr[i] = p;
quick(arr, leftIndex, i - 1);
quick(arr, i + 1, rightIndex);
}
}
private static void check(int[] arr) {
if (arr.length == 0 || arr.length == 1) {
return;
}
if (arr.length == 2) {
if (arr[0] > arr[1]) {
swap(arr, 0, 1);
}
return;
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int n = 100;
int[] arr = new int[n];
for (int k = 0; k < n; k++) {
int l = (int) (n * Math.random()); //随机生成0-100的数
arr[k] = l;
}
System.out.println("排序前:" + Arrays.toString(arr));
long start = System.currentTimeMillis();
shellSort(arr); // 希尔排序
// bubbleSort(arr); // 冒泡排序
// quickSort(arr); // 快速排序
// selectSort(arr); // 选择排序
// mergeSort(arr); // 归并排序
// insertSort(arr); // 插入排序
// heapSort(arr); // 堆排序
System.out.println("排序后:" + Arrays.toString(arr));
long end = System.currentTimeMillis();
System.out.println("耗时" + ( end - start ) + "毫秒");
}
}
数组排序算法工具类
于 2022-03-16 16:43:43 首次发布