IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2021-07-25 -> 正文阅读

[数据结构与算法]2021-07-25

使用java实现常见的排序算法

冒泡排序(Bubble Sort)

?冒泡排序关键在于比较相邻位置的数据,将逆序并且相邻的数据交换位置,每一次比较最大值都会往上浮,该种排序空间复杂度为O(1),时间复杂度为O( n 2 n^2 n2)。

public class BubbleSortImpl implements Sort {
    @Override
    public void sort(int[] nums) {
        for (int index = 0; index < nums.length; index++) {
            for (int secondIndex = 0; secondIndex < nums.length - 1 - index; secondIndex++) {
                if (nums[secondIndex] > nums[secondIndex + 1]) {
                    swap(nums, secondIndex, secondIndex + 1);
                }
                // 排序过程
                System.out.println(secondIndex + ":" + Arrays.toString(nums));
            }
        }
    }
}

选择排序(Choose Sort)

?选择排序关键在于通过遍历找到最小值,每次遍历标记最小值位置,然后将其和起始点交换,反向思考也可以优先找出最大值,该种排序空间复杂度为O(1),时间复杂度为O( n 2 n^2 n2)。

public class ChooseSortImpl implements Sort {
    @Override
    public void sort(int[] nums) {
        for (int i = 0; i < nums.length - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[j] < nums[minIndex]) {
                    minIndex = j;
                }
            }
            if (minIndex != i) {
                swap(nums, i, minIndex);
            }
            // 排序过程
            System.out.println(i + "-" + minIndex + ":" + Arrays.toString(nums));
        }
    }
}

最大堆排序(Heap Sort)

?最大堆是一种完全二叉树结构,其关键在于构建一颗父节点不小于子节点的最大堆,每次构建最大堆之后最大值处于根节点的位置,将该值交换到最大堆的末端节点,重新构建最大堆,直到根节点为止,堆排序的空间复杂度为O(1),时间复杂度为O( n l o g n nlogn nlogn)

public class HeapSortImpl implements Sort {
    @Override
    public void sort(int[] nums) {
        // 初始化最大堆
        for (int i = (nums.length >> 1) - 1; i >= 0; i--) {
            adjustHeap(nums, i, nums.length);
            System.out.println(Arrays.toString(nums));
        }

        for (int i = nums.length - 1; i > 0; i--) {
            swap(nums, 0, i);
            adjustHeap(nums, 0, i);
        }
    }

    /**
     * @param nums 数组
     * @param now  当前节点
     * @return void
     * @description 从第一个非叶子节点开始构建
     * @author shtao
     * @date 18:43 2021/7/25
     **/
    private void adjustHeap(int[] nums, int now, int last) {
        int swap = nums[now];
        for (int i = (now << 1) + 1; i < last; i = (i << 1) + 1) {
            if (i + 1 < last && nums[i] < nums[i + 1]) {
                i++;
            }
            if (nums[i] > swap) {
                nums[now] = nums[i];
                now = i;
            } else {
                break;
            }
        }
        nums[now] = swap;
    }
}

快排(Quick Sort)

?快排的思想在于选择一个值x,将比该值小的数挪到x的左边,将比x大的数挪到x右边,再采用相同的方法对x左右两边进行重排序。快排序的空间复杂度为O(1),时间复杂度为O( n l o g n nlogn nlogn)

public class QuickSortImpl implements Sort {
    @Override
    public void sort(int[] nums) {
        int left = 0;
        quickSort(nums, left, nums.length - 1);
    }

    /**
     * @description 快排
     * @author shtao
     * @date 21:10 2021/7/25
     * @param nums 数组
     * @param left 左边界
     * @param right 右边界
     * @return void
     **/
    private void quickSort(int[] nums, int left, int right) {
        if (left >= right) {
            return;
        }
        int beginIndex = left;
        int rightIndex = right;
        int swapNum = nums[left];
        while (beginIndex < rightIndex) {
            while (beginIndex < rightIndex && nums[rightIndex] >= swapNum) {
                rightIndex--;
            }
            nums[beginIndex] = nums[rightIndex];
            while (beginIndex < rightIndex && nums[beginIndex] <= swapNum) {
                beginIndex++;
            }
            nums[rightIndex] = nums[beginIndex];
        }
        nums[beginIndex] = swapNum;
        System.out.println(Arrays.toString(nums));
        quickSort(nums, left, beginIndex - 1);
        quickSort(nums, rightIndex + 1, right);
    }
}

归并排序(Merge Sort)

?归并排序的关键在于分冶-归并,首先将数组分冶为单个元素,然后将这些元素作为有序数组合并,最后归并完成后数组变得有序。归并排序的空间复杂度为O(n),时间复杂度为O( n l o g n nlogn nlogn)

public class MergeSortImpl implements Sort {
    @Override
    public void sort(int[] nums) {
        sort(nums, 0, nums.length - 1, new int[nums.length]);
    }

    /**
     * @param nums       数组
     * @param beginIndex 起点
     * @param endIndex   终点
     * @param temp       交换数组
     * @return void
     * @description 归并过程,分->合
     * @author shtao
     * @date 20:50 2021/7/25
     **/
    private void sort(int[] nums, int beginIndex, int endIndex, int[] temp) {
        if (beginIndex < endIndex) {
            int mid = (beginIndex + endIndex) >> 1;
            sort(nums, beginIndex, mid, temp);
            sort(nums, mid + 1, endIndex, temp);
            merge(nums, beginIndex, mid, endIndex, temp);
        }
    }

    /**
     * 合并两个有序数组
     *
     * @param nums       数组
     * @param beginIndex 起始点
     * @param endIndex   结束点
     * @param temp       交换用的数组
     * @return void
     * @author shtao
     * @date 20:48 2021/7/25
     **/
    private void merge(int[] nums, int beginIndex, int mid, int endIndex, int[] temp) {
        int tempIndex = 0;
        int i = beginIndex;
        int j = mid + 1;
        while (i <= mid && j <= endIndex) {
            if (nums[i] < nums[j]) {
                temp[tempIndex++] = nums[i++];
            } else {
                temp[tempIndex++] = nums[j++];
            }
        }
        while (i <= mid) {
            temp[tempIndex++] = nums[i++];
        }
        while (j <= endIndex) {
            temp[tempIndex++] = nums[j++];
        }
        tempIndex = 0;
        while (beginIndex <= endIndex) {
            nums[beginIndex++] = temp[tempIndex++];
        }
    }
}

附录

接口类

public interface Sort {
    /**
     * @param nums 数组
     * @return void
     * @description 排序
     * @author shtao
     * @date 14:16 2021/7/25
     **/
    void sort(int[] nums);

    /**
     * 交换位置
     *
     * @param nums   数组
     * @param index1 index1
     * @param index2 index2
     **/
    default void swap(int[] nums, int index1, int index2) {
        int swap = nums[index2];
        nums[index2] = nums[index1];
        nums[index1] = swap;
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-26 12:18:24  更:2021-07-26 12:20:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/24 5:15:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码