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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 排序算法(8种) -> 正文阅读

[数据结构与算法]排序算法(8种)

性能:

1.冒泡排序

每次遍历排序都找出一个最大值放在后面 就像冒泡一样 应用了交换的思想

[3,?9,?-1, 10, 20]
第1次遍历排序:
[3, -1, 9, 10, 20]
第2次遍历排序:
[-1, 3, 9, 10, 20]
第3次遍历排序:
[-1, 3, 9, 10, 20]
第4次遍历排序:
[-1, 3, 9, 10, 20]
最终排序结果:
[-1, 3, 9, 10, 20]

*所以5个数组进行4次遍历排序就可

*根据上面的遍历我们还发现第三次遍历数组已经有序,无需进行第四次遍历,所以我们可以对这点进行优化 。? 也就是如果经历一次遍历排序一次交换也没发生,那么我们就认为这个数组已经有序,直接retuen.

1.1代码实现:

/**
     * 冒泡排序
     * @param arr 进行排序的数组
     * @return 排好序的数组
     */
    public static int[] bubbleSort(int[] arr) {
        int temp = 0;
        int count = 0;

        for (int i =  arr.length-1; i > 0; i--) {
            count = 0;
            //每次循环都遍历出了一个最大的放在数组的后面
            for (int j = 0; j < i ; j++) {
                //如果比后一个元素大则进行交换
                if(arr[j] > arr[j+1]) {
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                   //记录进行交换的次数
                    count++;
                }
            }

//            System.out.println("第" + (arr.length-i)  +"次排序:");
//            System.out.println(Arrays.toString(arr));
            //说明已经有序了 无须在排
            if(count == 0) {
                return arr;
            }
            
        }
        return arr;
    }

1.2测试排序十万个随机数所需要的时间:

        //创建随机数组
        int[] testArr = new int[100000];

        for (int i = 0; i < testArr.length; i++) {
            //生成[0,8000]间的随机数
            testArr[i] = (int) (Math.random()*8000000);
        }

        //开始时间
        Date dataBegin = new Date();

        //冒泡排序
        sort.bubbleSort(testArr);

        //结束时间
        Date dataEnd = new Date();
        System.out.println(dataEnd.getTime()-dataBegin.getTime());

结果:14523ms

?

2.简单选择排序

每次遍历排序都选择一个最小值 然后与最前面的数进行交换? 与冒泡排序不同 只交换一次

[3, 9, -1, 10, 20]
第1次遍历排序:
[-1, 9, 3, 10, 20]
第2次遍历排序:
[-1, 3, 9, 10, 20]
第3次遍历排序:
[-1, 3, 9, 10, 20]
第4次遍历排序:
[-1, 3, 9, 10, 20]
最终排序结果:
[-1, 3, 9, 10, 20]

2.1代码实现

/**
     * 选择排序
     * @param arr 进行排序的数组
     * @return 排好序的数组
     */
    public static int[] selectSort(int[] arr) {
        int temp = 0;
        //最小值的下标
        int min = 0;
        for (int i = 0; i < arr.length - 1; i++) {
            //先假设最小的数是arr[i]
            min = i;
            //遍历找到最小的那个
            for (int j = i + 1; j < arr.length; j++) {
                //如果发现arr[j] 比 arr[min]小 则令min = j
                if(arr[j] < arr[min]) {
                    min = j;
                }
            }
            //将的到的最小值与arr[i]进行交换
            if (min != i) {
                temp = arr[min];
                arr[min] = arr[i];
                arr[i] = temp;
            }
//            System.out.println("第" + (i+1)  +"次排序:");
//            System.out.println(Arrays.toString(arr));
        }
        return arr;
    }

2.2测试排序十万个随机数所需要的时间:

        //创建随机数组
        int[] testArr = new int[100000];
        for (int i = 0; i < testArr.length; i++) {
            //生成[0,8000]间的随机数
            testArr[i] = (int) (Math.random()*8000000);
        }

        //开始时间
        Date dataBegin = new Date();

        //选择排序
        sort.selectSort(testArr);

        //结束时间
        Date dataEnd = new Date();
        System.out.println(dataEnd.getTime()-dataBegin.getTime());

结果:4024ms

3.直接插入排序

先将要排序数组中第一个数当作以已排序好的数组,然后依次遍历剩下的数 按顺序插入已排序好的数组。全部遍历一遍后则得到一个排序好的数组。

[3, 9, -1, 10, 20]
第1次遍历排序:
[3, 9, -1, 10, 20]
第2次遍历排序:
[-1, 3, 9, 10, 20]
第3次遍历排序:
[-1, 3, 9, 10, 20]
第4次遍历排序:
[-1, 3, 9, 10, 20]
最终排序结果:
[-1, 3, 9, 10, 20]

3.1代码实现:

/**
     * 插入排序
     * @param arr 进行排序的数组
     * @return 排好序的数组
     */
    public static int[] insertSort(int[] arr) {
        //要插入的值
        int insertValue;
        //插入的下标
        int insertIndex;
        for (int i = 1; i < arr.length; i++) {
            insertValue = arr[i];
            //先假设为已经 排好序的数组中最后一个
            insertIndex = i - 1;
            //如果下标小于0了说明已经跟 已排好序的数组全部做过了比较
            //如果要插入的那个值 小于 已排好序的数组中最后一个 九将这个数后移以为 然后在往前遍历 依此比较
            //知道找到一个比要插入值小的 则该点就是要插入的点
            //如果一次while循环也没进入 则说明要插入的这个值比 已排好序的数组中所有的都要大
            while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
                arr[insertIndex + 1] = arr[insertIndex];
                insertIndex--;
            }
            //将值插入
            arr[insertIndex + 1] = insertValue;

            System.out.println("第" + i +"次遍历排序:");
            System.out.println(Arrays.toString(arr));
        }

        return arr;
    }

3.2测试排序十万个随机数所需要的时间:


        //创建随机数组
        int[] testArr = new int[100000];
        for (int i = 0; i < testArr.length; i++) {
            //生成[0,8000]间的随机数
            testArr[i] = (int) (Math.random()*8000000);
        }


        //开始时间
        Date dataBegin = new Date();


        //插入排序

        sort.insertSort(testArr);

        //结束时间
        Date dataEnd = new Date();
        System.out.println(dataEnd.getTime()-dataBegin.getTime());

结果:855

?

希尔排序

快速排序

归并排序

基数排序

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章           查看所有文章
加:2021-07-29 11:53:53  更:2021-07-29 11:57:20 
 
开发: 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年11日历 -2024/11/25 17:22:04-

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