0
点赞
收藏
分享

微信扫一扫

常见的几个排序算法

googlefrank 2023-07-27 阅读 58

/**
 * @author longFei
 * @since 2023/4/14 19:17
 */
public class ListTest {

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(5, 3, 8, 4, 19, 2);

        // 排序前
        System.out.println(Arrays.toString(list.toArray()));
        // 排序
        selectSort(list);
        // 排序后
        System.out.println(Arrays.toString(list.toArray()));

    }

    /**
     * 冒泡排序算法
     */
    public static void bubbleSort(List<Integer> list) {
        System.out.println("===== 冒泡排序 =====");
        int length = list.size();
        for (int i = 1; i < length; i++) {
            for (int j = 0; j < length - i; j++) {
                int a = list.get(j);
                int b = list.get(j + 1);
                if (a > b) {
                    list.set(j, b);
                    list.set(j + 1, a);
                }
            }
        }

    }
    

    /**
     * 选择排序
     * 遍历集合,找到最小的放在未排序的第一位
     * 再从剩下的元素中继续执行上一步
     */
    public static void selectSort(List<Integer> list) {
        System.out.println("===== 选择排序 =====");
        int length = list.size();
        int minNum, minIndex;
        for (int i = 0; i < length - 1; i++) {
            minNum = list.get(i);
            minIndex = i;
            // 获取未排序的元素中最小的值
            for (int j = i + 1; j < length; j++) {
                if (minNum > list.get(j)) {
                    minNum = list.get(j);
                    minIndex = j;
                }
            }
            // 将最小值排到未排序元素的第一位
            list.set(minIndex, list.get(i));
            list.set(i, minNum);
        }
    }


    /**
     * 插入排序
     * 通过一个循环逐步将数组分为两部分,左侧已排序的,右侧待排序的
     * 将右侧的元素逐个按照从大到小插入到左侧已排序的数组中
     */
    public static void insertionSort(List<Integer> list) {
        System.out.println("===== 插入排序 =====");
        int length = list.size();
        int selected, ordered;
        // 遍历待比较的所有元素
        for (int i = 1; i < length; i++) {
            // 取本轮选择的元素
            selected = list.get(i);
            // 将本轮选择的元素与已排序的元素依次比较
            // 若 selected < ordered,则二者交换,否则,跳出本次循环
            for (int j = i - 1; j >= 0; j--) {
                ordered = list.get(j);
                if (selected < ordered) {
                    list.set(j + 1, ordered);
                    list.set(j, selected);
                } else {
                    break;
                }
            }
        }
    }


    /**
     * 快速排序
     * 通过选取一个基准元素将数组分为两部分,然后继续对这两部分进行快速排序,直到排序完成
     */
    public static void quickSort(List<Integer> list, int start, int end) {
        int i, j, pivot, temp;
        if (start > end) {
            return;
        }
        // 基准数
        pivot = list.get(start);
        i = start;
        j = end;

        while (i < j) {
            // 从右向左
            while (i < j && pivot < list.get(j)) {
                j--;
            }
            // 从左向右
            while (i < j && pivot > list.get(i)) {
                i++;
            }
            // 交换左侧大于基准数的和右侧大于基准数的
            if (i < j) {
                temp = list.get(i);
                list.set(i, list.get(j));
                list.set(j, temp);
            }
        }
        quickSort(list, start, j - 1);
        quickSort(list, j + 1, end);
    }

    
}

举报

相关推荐

0 条评论