数据结构面试题和常用算法(4)

news/2024/7/19 12:15:20 标签: 算法, 数据结构, 列表, 排序算法

排序算法

这种算法就是 先写好 运行一次 的代码, 之后再在外面嵌套循环

1.1 冒泡排序

在这里插入图片描述

package paixu;

import java.util.Arrays;

/**
 * @program: jdk8Test
 * @description: 排序算法
 * @author: liuchen
 * @create: 2020-03-26 21:32
 **/
public class Test {
    public static void main(String[] args) {
        int[] map = {1, 3, 43, 244, 9044};
        demo1(map);
        System.out.println(Arrays.toString(map));
    }

    public static void demo1(int[] map) {

        boolean flag = false; //标记位置
        for (int j = 0; j < map.length - 1; j++) {
            for (int i = 0; i < map.length - 1 - j; i++) {
                if (map[i] > map[i + 1]) {
                    map[i] = map[i] ^ map[i + 1];
                    map[i + 1] = map[i] ^ map[i + 1];
                    map[i] = map[i] ^ map[i + 1];
                    flag = true;
                }
            }
            //在交换中一次都没有发送,那就说明现在的序列数有序的。
            if (flag == false) {
                break;
            } else {
                //说明有排序,重置标记位
                flag = false;
            }

        }
    }


}

1.2 选择排序

在这里插入图片描述
在这里插入图片描述
代码

 public static void demo2(int[] map) {
        //选择排序
        for (int j = 0; j < map.length - 1; j++) {
            int min = map[j];
            int minIndex = j;
            for (int i = j; i < map.length - 1; i++) {
                if (min > map[i + 1]) {
                    min = map[i + 1];//找到最小值
                    minIndex = i + 1;
                }
            }
            //交换
            map[minIndex] = map[j];
            map[j] = min;
            System.out.println(Arrays.toString(map));
            System.out.println("=============================");
        }
    }

1.3 插入排序

在这里插入图片描述
写这个算法和之前的算法是一样 都是先写出运行一遍,之后在写运行多遍,找出规律

/******************************************************************************************************************

                      这是运行分部运行
*******************************************************************************************************************
*/

 public static void demo3(int[] map)
    {
        	//这是第一遍
            int currentValue=map[1]; //当前的无序列表的第一个元素
            int insertIndex = 1-1; //有序列表的第一个元素 。在第一次的时候,有序表只有一个下标为0的元素,
            while (insertIndex >=0 && currentValue<map[insertIndex]){
                map[insertIndex+1] = map[insertIndex];//数据移动。 从有序表到无序表
                insertIndex--;
            }
            //循环跳出之后,说明找到合适的位置 赋值就好
            map[insertIndex+1] = currentValue;
			

	    //第二次
		   int currentValue=map[2]; //当前的无序列表的第一个元素
            int insertIndex = 2-1; //有序列表的第一个元素 。在第二次时候执向有序表的从左往右数的最后一个
            while (insertIndex >=0 && currentValue<map[insertIndex]){
                map[insertIndex+1] = map[insertIndex];//数据移动。 从有序表到无序表
                insertIndex--;
            }
            //循环跳出之后,说明找到合适的位置 赋值就好
            map[insertIndex+1] = currentValue;            
            

    }

通过上面的代码,就有下面的代码,只是改变了一点点 用变量控制

 public static void demo3(int[] map) {
        for (int i = 1; i < map.length; i++) {//从1开始 因为刚开始的时候有序表都是第一个元素,无序表是下标为1的元素
            int currentValue = map[i]; //当前的无序列表的第一个元素
            int insertIndex = i - 1; //有序列表的第一个元素 。在第二次时候执向有序表的从左往右数的最后一个
            while (insertIndex >= 0 && currentValue < map[insertIndex]) {
                map[insertIndex + 1] = map[insertIndex];//数据移动。 从有序表到无序表
                insertIndex--;
            }
            //循环跳出之后,说明找到合适的位置 赋值就好
            map[insertIndex + 1] = currentValue;
        }

    }

1.4 希尔排序

这里要说插入排序存在的问题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//第一次
 for (int i = 5; i < map.length; i++) {
            for (int j = i-5; j >=0  ; j -= 5) {
                if(map[j] > map[j+5]){
                    map[j] = map[j] ^ map[j+5];
                    map[j+5] = map[j] ^ map[j+5];
                    map[j] = map[j] ^ map[j+5];
                }
            }
        }
        System.out.println(Arrays.toString(map));

完整
下面的方式会让排序更慢,他是交换两个值。

  public static void demo4(int[] map) {

        for (int grap = map.length / 2; grap > 0; grap /= 2) {
            for (int i = grap; i < map.length; i++) {
                for (int j = i - grap; j >= 0; j -= grap) {
                    if (map[j] > map[j + grap]) {
                        map[j] = map[j] ^ map[j + grap];
                        map[j + grap] = map[j] ^ map[j + grap];
                        map[j] = map[j] ^ map[j + grap];
                    }
                }
            }
        }
        

        System.out.println(Arrays.toString(map));


    }

改良版 牛皮的很

 public static void demo5(int[] map) {
        //定义步长
        for (int grap = map.length / 2; grap > 0; grap /= 2) {
            //用插入排序
            for (int i = grap; i < map.length; i++) {
                int j = i;
                int temp = map[j];
                if (map[j] < map[j - grap]) {
                    while (j - grap >= 0 && temp < map[j - grap]) {
                        map[j] = map[j - grap];
                        j -= grap;
                    }
                    map[j] = temp;
                }
            }

        }
        System.out.println(Arrays.toString(map));
    }

1.5 快速排序

数据结构 韩顺平老师

1.6 归并排序

数据结构 韩顺平老师

1.7基数排序

数据结构 韩顺平老师

排序算法时间复杂度比较

在这里插入图片描述


http://www.niftyadmin.cn/n/1201820.html

相关文章

js image 获取rgb_Java获取鼠标当前颜色RGB、获取鼠标当前HEX值、获取鼠标当前坐标(源码)

Lete乐特自制实用工具(Java EE - JDK1.8) 现在自己也是一名程序员了&#xff0c;想着以前用的都是别人打包好的exe文件&#xff0c;于是就动手自己写个吧&#xff1f;把RGB、HEX值、坐标、合并到一起自己用的也方便。XY.javapackage io.github.lete114.tools;import javax.swin…

牛客网编程题(1)

1. vivo第一题 在vivo产线上&#xff0c;每位职工随着对手机加工流程认识的熟悉和经验的增加&#xff0c;日产量也会不断攀升。 假设第一天量产1台&#xff0c;接下来2天(即第二、三天)每天量产2件&#xff0c;接下来3天(即第四、五、六天)每天量产3件 … … 以此类推&#xff…

javascript乘法和加法_JavaScript编程语言学习笔记——基础

-1st- 概述本文主要粘贴自&#xff1a;www.w3school.com.cn/js/index.asp&#xff0c;详情可打开该网站查看&#xff0c;本人仅做简化整理。HTML、CSS、JavaScript三大语言&#xff0c;是网页前端工程师必备的基础语言。HTML用于组织网页内容&#xff0c;CSS用于网页的…

java线程(1) —— 自定义线程池(1)

自定义线程池 1. 线程池的作用 减少在创建和销毁线程上所花的时间以及系统资源的开销如果不使用线程池&#xff0c;有可能造成系统创建大量线程而导致消耗完系统内存 2. 实现自定义的线程池 构建步骤 消息队列&#xff08;任务队列&#xff09;线程池测试 想法: 按照上面的…

python百度贴吧登录协议_分享一个简单的爬虫案例,几十行代码爬取百度贴吧,原理简单易懂...

原标题&#xff1a;分享一个简单的爬虫案例&#xff0c;几十行代码爬取百度贴吧&#xff0c;原理简单易懂通过python实现百度贴吧页面的内容采集是相对来说比较容易的&#xff0c;因为百度贴吧不需要登陆&#xff0c;不需要cookie&#xff0c;不需要设置http的MIME头本案例使用…

java线程(1) —— 自定义线程池(2)

java线程(1) —— 自定义线程池&#xff08;2&#xff09; 上篇文章存在的问题 put方法没有超时等待&#xff0c;如果消息队列没有消费&#xff0c;如果消息队列一直是满的&#xff0c;生产者应该是什么操作&#xff0c;有以下的几种策略 超时等待让调用者放弃任务执行死等让…

python可以编程什么_python可以实现什么

如果你想学python&#xff0c;或者你刚开始学习Python&#xff0c;那么你可能会问&#xff1a;“我能用Python做什么&#xff1f;”g3o少儿编程网-Scratch_Python_教程_免费儿童编程学习平台这个问题不好回答&#xff0c;因为Python有很多用途。g3o少儿编程网-Scratch_Python_教…

mybatis实现权限拦截器(一)

1. mybais拦截器 最近看公司的代码&#xff0c;发现mapper里面方法上有的方法添加了 DAtaPermission 注解&#xff0c;查遍了也不知道是哪个框架里面的东西。问了带我的师傅&#xff0c;人给我回复 Intercept。下班后默默的查了起来&#xff0c;才知道是mybatis里面的插件功能…