常见排序算法的Java实现

x33g5p2x  于2022-03-24 转载在 Java  
字(1.7k)|赞(0)|评价(0)|浏览(231)

测试类

import com.example.test.algorithms.util.SortUtil;
import org.apache.commons.lang3.ArrayUtils;

import java.util.Random;
public class TestSort {
    private static final int N = 10;
    public static void main(String[] args) {
        int[] arr = new Random().ints(0, N).distinct().limit(N).toArray();
        System.out.println("排序前:" + ArrayUtils.toString(arr));
        SortUtil.bubbleSort(arr);
        System.out.println("排序后:" + ArrayUtils.toString(arr));
    }
}

排序算法:

public class SortUtil {
    /**
     * 冒泡排序
     *
     * @param arr
     */
    public static void bubbleSort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr, j, j + 1);
                }
            }
        }
    }

    public static void quickSort(int[] arr) {
        doQuickSort(arr, 0, arr.length - 1);
    }

    /**
     * 快速排序
     * 不适合含有重复元素的
     *
     * @param arr
     * @param left
     * @param right
     */
    private static void doQuickSort(int[] arr, int left, int right) {
        if (left >= right) {
            return;
        }
        int base = arr[left];
        int l = left;
        int r = right;
        while (l < r) {
            // 从右向左找比基准数小的
            while (r > l && arr[r] > base) {
                r--;
            }
            // 从左向右找比基准数大的
            while (l < r && arr[l] < base) {
                l++;
            }
            // 还存在比基准数大的或者比基准数小的
            if (l < r) {
                swap(arr, l, r);
            }
        }
        // 基准数归位 此时l == r
//        arr[l] = arr[r];
        arr[r] = base;
        doQuickSort(arr, left, r - 1);
        doQuickSort(arr, l + 1, right);
    }

    /**
     * 选择排序:
     * 遍历找最小的 交换位置
     *
     * @param arr
     */
    public static void selectSort(int[] arr) {
        int minIndex = 0;
        for (int i = 0; i < arr.length; i++) {
            minIndex = i;
            for (int j = i; j < arr.length; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            swap(arr, i, minIndex);
        }
    }

    /**
     * 插入排序
     * 找到小的数,插入到前面
     *
     * @param arr
     */
    public static void insertSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int current = arr[i + 1];
            int preIndex = i;
            while (preIndex >= 0 && current < arr[preIndex]) {
                arr[preIndex + 1] = arr[preIndex];
                preIndex--;
            }
            arr[preIndex + 1] = current;
        }
    }

    private static void swap(int[] arr, int i, int j) {
        int temp = arr[j];
        arr[j] = arr[i];
        arr[i] = temp;
    }
}

相关文章

微信公众号

最新文章

更多