刷题DAY7

news2024/12/28 20:30:27

三个数的排序

题目:输入三个整数x,y,z,请把这三个数由小到大输出

输入:输入数据包含3个整数x,y,z,分别用逗号隔开

输出:输出由小到大排序后的结果,用空格隔开

输入:2,1,3

输出:1 2 3

import java.util.Arrays;
import java.util.Scanner;
​
    public class 三个数排序 {
        public static void main(String[] args) {
            int[] num = new int[3];
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入3个整数:");
            num[0] = sc.nextInt();
            num[1] = sc.nextInt();
            num[2] = sc.nextInt();
            Arrays.sort(num);
            System.out.println("从小到大排序后的结果:");
            for (int i = 0; i < num.length; i++) {
                System.out.print(num[i]+"\t");
            }
        }
    }
​
​

知识点

排序

所谓排序就是按照其中的某个或某些关键字的大小,按照升序或者降序的方式把他们排列起来的操作。

排序算法时间复杂度(平均)时间复杂度(最坏)时间复杂度(最好)空间复杂度稳定性
冒泡排序O(n^2)O(n^2)O(n)O(1)稳定
选择排序O(n^2)O(n^2)O(n^2)O(1)不稳定
插入排序O(n^2)O(n^2)O(n)O(1)稳定
希尔排序O(n log n)O(n^2)O(n)O(1)不稳定
归并排序O(n log n)O(n log n)O(n log n)O(n)稳定
快速排序O(n log n)O(n^2)O(n log n)O(log n)不稳定
堆排序O(n log n)O(n log n)O(n log n)O(1)不稳定
计数排序O(n+k)O(n+k)O(n+k)O(k)稳定
桶排序O(n^2)O(n^2)O(n)O(n+k)稳定
基数排序O(n*k)O(n*k)O(n*k)O(n+k)稳定
冒泡排序

一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就交换位置。这个过程持续对数列的末尾进行,直到整个数列都排序完成。

public static void bubbleSort(int[] array){
    for(int i = 0;i < array.length - 1;i++){
        //flag 是用来判断数组中元素是否经过交换
        boolean flag = true;
        for(int j = 0;j < array.length - i - 1;j++){
            if(array[j] > array[j + 1]){
                swap(array,j,j + 1);
                flag = false;
            }
        }
        if(flag){
            return;
        }
    }
}
public static void swap(int[] array,int i,int j){
    int tmp = array[i];
    array[i] = array[j];
    array[j] = tmp;
}
选择排序

一种简单的比较排序算法,它将数组分为已排序和未排序两部分,每次从未排序部分选择最小的元素并将其放入已排序部分。它的时间复杂度为O(n^2),不适用于大规模数据集。

public static void selectSort(int[] array){
    for(int i = 0;i < array.length - 1;i++){
        int maxIndex = 0;
        for(int j = 0;j < array.length - i;j++){
            if(array[j] > array[maxIndex]){
                maxIndeex = j;
            }
        }
        swap(array,maxIndex,array.length - i - 1);
    }
}
public static void swap(int[] array,int i,int j){
    int tmp = array[i];
    array[i] = array[j];
    array[j] = tmp;
}
插入排序

就是从无序区间中拿出元素,直接插入到有序区间中,知道无序区间的长度为0时,可以得到一个有序序列。

public static void insertSort(int[] array){
    //有序数组:[0 , i]   无序数组:[i + 1, array.length]
    for(int i = 0;i < array.length - 1;i++){
        int x = array[i + 1];
        int j;
        for(j = i;j >= 0 && array[j] > x;j--){
            array[j + 1] = array[j];
        }
        array[j + 1] = x;
    }
}
快速排序

任取待排序序列中的某元素为基准值,按照大于基准值,小于基准值的规则,左子序列中为小于基准值的元素,右子序列中为大于基准值的元素,然后让左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

快速排序主要有三种方法:①Hoare法、②挖坑法、③前后指针

public static void quickSort(int[] array){
    quickSortInternal(array,0,array.length - 1);
}
public static void quickSortInternal(int[] array,int from,int to){
    if(to - from + 1 <= 1){
        return;
    }
    int i = partition3(array,from,to);
    quickSortInternal(array,from,i - 1);
    quickSortInternal(array,i + 1;to);
}
public static void swap(int[] array,int i,int j){
    int tmp = array[i];
    array[i] = array[j];
    array[j] = array[i];
}
//方法1:Hoare法
public static int partitionHoare(int[] array int from,int to){
    int pivot - array[to];
    int left = from;
    int right = to;
    while(left < right){
        whlie(left < right && array[left] <= pivot){
            left++;
        }
        swap(array,left,right);
        while(left < right && array[right] >= pivot){
            right--;
        }
        swap(array,left,right);
    }
    return right;
}
//方法2:挖坑法
public static int partitionDigHole(int[] array,int from,int to){
    int pivot = array[to];
    int left = from;
    int right = to;
    while(left < right){
        while(left < right && array[left] <= pivot){
            left++;
        }
        array[right] = array[left];
        while(left < right && array[right] >= pivot){
            right--;
        }
        array[left] = array[right];
    }
    array[left] = pivot;
    return left;
}
//方法3:前后指针法
public static int partiton3(int[] array,int from,int to){
    int pivot = array[to];
    int b = from;
    for(int d = from;d < to;d++){
        if(array[d] < pivot){
            swap(array,b,d);
            b++;
        }
    }
    swap(array,b,to);
    return b;
}
归并排序

将已经有序的子序列合并,得到完全有序的序列,即先将每个子序列有序,再使子序列段间有序。就是先将一个序列分割成很多个只包含一个元素的序列,然后逐一进行合并排序,最后得到一个有序的序列。

注:归并排序也可以用在外部排序中

public static void mergeSort(int[] array){
    mergeSortInternal(array,0,array.length);
}
public static void mergeSortInternal(int[] array,int from,int to){
    if(to - from <= 1){
        return;
    }
    int mid = from + (to - from) / 2;
    mergeSortInternal(array,from,mid);
    mergeSortInternal(array,mid,to);
    merge(array,from,mid,to);
}
public static void merge(int[] array,int from,int mid,int to){
    int size = to - from;
    int[] e = new int[size];
    int eIdx = 0;
    int leftIdx = from;
    int rightIdx = mid;
    while(leftIdx < mid && right < to){
        if(array[leftIdx] < array[rightIdx]){
            e[eIdx] = array[leftIdx];
            eIdx++;
            leftIdx++;
        }else{
            e[eIdx] = array[right];
            eIdx++;
            rightIdx++:    
        }
    }
    while(left < mid){
        e[eIdx] = array[leftIdx];
        eIdx++;
        leftIdx++;
    }
    while(right < to){
        e[eIdx] = array[rightIdx];
        eIdx++;
        rightIdx++;
    }
    for(int i = 0;i < size;i++){
        array[from + i] = e[i];
    }
}
希尔排序

将待排序的数组按照一定的间隔进行分组,对每组使用插入排序算法进行排序,然后缩小间隔,再对分组进行排序,直到间隔为1为止

特点:逐渐减小间隔大小的方法有助于提高排序过程的效率,可以减少比较和交换的次数

public static void shellSort(int[] array){
    if(array.length == 0){
        return;
    }
    int gap = array.length / 2;
    while(true){
        for(int i = gap;i < array.length;i++){
            int x = array[i];
            int j;
            for(j = i - gap; j >= 0 && array[j] > x;j = j - gap){
                array[j + gap] = array[j];
            }
            array[j + gap] = x;
        }
        if(gap == 1){
            break;
        }
        gap = gap / 2;
    }
}
堆排序

利用二叉树建堆的一种排序算法,在排升序时,创建大堆,每次都先将堆顶元素和堆中最后一个元素进行交换后,将原来的堆顶元素拿出放入有序区间的起始位置,并且无序区间中减少一个元素。

在堆排序中,升序要建大堆,降序要建小堆,升序时的区间被划分为无序区间

在这里有一个需要注意的点,虽然说降序要建小堆(区间分为有序区间),但是其实这是办不到的,那么要是想排成降序怎么办呢?在我看来要使用Comparator接口,重新定义大小关系,将本来是小的看作是大的,本来是大的看作小的,然后再按照升序的方法进行排序

public class Heap {
    // 堆排序方法
    public static void heapSort(int[] arr) {
        int n = arr.length;
        // 构建大根堆,
        // 这段代码是构建大根堆的过程,它的循环次数为n/2-1次,是因为在完全二叉树中,叶子节点不需要进行堆化操作,
        // 所以只需要对非叶子节点进行堆化,而非叶子节点的数量为n/2-1个。因此,只需要循环n/2-1次即可完成大根堆的构建。
        // 非叶子节点在一维数组中就是前面 n/2-1
        for (int i = n / 2 - 1; i >= 0; i--) {
            // 从最底层的根节点开始堆化,每次执行完成后,都找出最大值,并放在根节点位置
            // 逐层往上找,循环结束后,第一个元素肯定是最大值
            heapify(arr, n, i);
        }
        // 依次取出堆顶元素,并将余下元素继续堆化,得到有序序列
        for (int i = n - 1; i >= 0; i--) {
            // 第一个for循环已经找出最大值,所以先做交货,把最大值换到最后一个位置
            // 把最大值交换到最后一个位置,下一次循环最后一个位置就不比较了
            swap(arr, 0, i);
            // 继续找出最大值,放在第一个位置
            heapify(arr, i, 0);
        }
    }
​
    private static void heapify(int[] arr, int heapSize, int i) {
        int largest = i; // 初始化假设最大值为根节点
        int left = 2 * i + 1; // 相对于索引i的左节点索引
        int right = 2 * i + 2; // 相对于索引i的右节点索引
        // 找到左右子节点中的最大值
        if (left < heapSize && arr[left] > arr[largest]) {
            // 如果有左节点,且左节点大于根节点,则记录左节点为最大值
            largest = left;
        }
        if (right < heapSize && arr[right] > arr[largest]) {
            // 如果有右节点,且右节点大于最大值,则记录右节点为最大值
            largest = right;
        }
        // 上面两个if之后,肯定找到最大值
        if (largest != i) {
            // i 是根节点下标
            // 如果最大值不是根节点,则交换根节点与最大值节点,
            // 并递归地对最大值节点进行堆化
            swap(arr, i, largest);
            heapify(arr, heapSize, largest);
        }
    }
​
    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
​
    public static void main(String[] args) {
        int[] arr = {5, 2, 8, 3, 12, 35, 57, 1, 6};
        int[] expectedArr = {1, 2, 3, 5, 6, 8, 12, 35, 57};
        Heap.heapSort(arr);
        System.out.println("arr = " + Arrays.toString(arr));
        Assertions.assertArrayEquals(expectedArr, arr);
    }
}
​

三个整数

题目:给出三个整数,请你设计一个程序,求出这三个数的和,乘积和平均数

输入:输入只有三个正整数a,b,c

输出:输出一行,包括三个的和,乘积,平均数

数据之间用一个空格隔开,其中平均数保留小数点后 面两位

输入:1,2,3

输出:6,6,2.00

import java.util.Scanner;
public class 三个整数 {
    public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner reader = new Scanner(System.in);
            int a, b, c, sum, ji;
            double ave;
            a = reader.nextInt();
            b = reader.nextInt();
            c = reader.nextInt();
            sum = a + b + c;
            ji = a * b * c;
            ave = sum / 3.00;
            System.out.print(sum + " ");
            System.out.print(ji + " ");
            System.out.printf("%.2f", ave);// 浮点型数据输出,注意和c/c++不同的是double对应的数据类型是
            // %f,而非%lf;
        }
​
    }
​
​
​

知识点

ToDo Auto-generated method stub

*Auto-generated method stub* 意思是生成方法存根,就是“自动生成方法(空函数)”。编程软件在你使用代码生成时,自动帮你加上的,告诉你这些段代码是开发工具生成的,就是一个提示,可以删除的。

automatic 自动的; generated 生成;method 方法;stub 存根;空函数;TODO 就是说在这写你自己的新代码

生成方法存根:如果某个方法,你还没有定义就开始使用,此时,可以通过你使用这种方法的情况由开发工具自动给你写好方法的最基本定义。比如说,当我们写好接口(即抽象类),然后去写接口的实现类(具体要实现的内容)。如果我们不用自动生成去手写一来麻烦,二来可能漏掉方法没有实现,会报错(因为必须实现抽象类的全部方法)。 ——————————————————————————

快速去掉:Ctrl+F 搜索这段话,Ctrl+D删除光标所在行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

O2OA开发知识-后端代理/接口脚本编写也能像前端一样用上debugger

在o2oa开发平台中&#xff0c;后端代理或者接口的脚本编写也能像前端一样用上debugger&#xff0c;这是来自藕粉社区用户的宝贵技术支持。 感谢藕粉社区论坛用户提供的技术分享&#xff01;tzengsh_BTstthttps://www.o2oa.net/forum/space-uid-4410.html 论坛地址&#xff1a…

【Kubernetes】k8s集群图形化管理工具之rancher

目录 一.Rancher概述 1.Rancher简介 2.Rancher与k8s的关系及区别 3.Rancher具有的优势 二.Rancher的安装部署 1.实验准备 2.安装 rancher 3.rancher的浏览器使用 一.Rancher概述 1.Rancher简介 Rancher 是一个开源的企业级多集群 Kubernetes 管理平台&#xff0c;实…

2024年高教社杯数学建模国赛A题思路解析+代码+论文

2024年高教社杯全国大学生数学建模竞赛&#xff08;以下简称国赛&#xff09;将于9月5日晚6时正式开始。 下文包含&#xff1a;2024国赛思路解析​、国赛参赛时间及规则信息说明、好用的数模技巧及如何备战数学建模竞赛 C君将会第一时间发布选题建议、所有题目的思路解析、相…

Axure:引领智慧时代的数据可视化原型设计先锋

在数字化转型的浪潮中&#xff0c;智慧农业、智慧城市、智慧社区、智慧水务等概念如雨后春笋般涌现&#xff0c;它们不仅重塑了我们的生活空间&#xff0c;也对数据可视化提出了前所未有的要求。作为原型设计领域的佼佼者&#xff0c;Axure RP凭借其强大的交互设计能力和直观的…

关于Nachi机器人自动运行上电条件

Nachi 机器人有两种控制柜&#xff0c;分别为 FD 控制柜和 CFD 控制柜。 对于 FD 控制器&#xff0c;执行以下操作。 1.旋转控制柜钥匙&#xff0c;使其对准标注位置①。 2.旋转示教器旋钮至下图所示位置。然后依次单击绿色按钮与白色按钮&#xff0c;机器人上电运行。 对于…

2025大数据毕业设计/计算机毕业设计创新必过选题(建议收藏)

一、大数据题目 项目架构模式&#xff1a; 1、数据Python爬虫&#xff1a;selenium、requests、DrissionPage等爬虫框架 2、hadoop、Spark、Flink&#xff08;PyFlink&#xff09;数据分析【可vmvare虚拟机可windwos电脑】 3、springboot、vue.js前后分离构建系统主体 4、…

排序篇——递归实现快速排序(hoare版-挖坑法-前后指针版)

目录 前言 一、key&#xff1f; 二、思路及代码实现 1.hoare版 2.挖坑法 3.前后指针版本 总结 前言 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法。它会选出一个基准值(key)&#xff0c;把它放到正确的位置(排序之后的位置)。 提示&#xff1a;以下是本篇…

c语言学习,tolower ()函数分析

1&#xff1a;tolower() 函数说明&#xff1a; 检查参数c&#xff0c;为大写字母返回对应的小写字母 2&#xff1a;函数原型&#xff1a; int toascii(int c) 3&#xff1a;函数参数&#xff1a; 参数c&#xff0c;为检测整数 4&#xff1a;返回值&#xff1a; 返回转换的小…

【Python】生成二维迷宫的算法

前言 哈里最近因为一个小插曲打算写一个设计迷宫的算法。为了锻炼脑力&#xff0c;特地没有上网搜索而是自己摸索出一个迷宫设计算法。 概述 1、需求 哈里准备实现下图的迷宫。 2、分析 可以看到&#xff0c;图里凡是x和y坐标为单数时&#xff0c;总是白色。于是哈里得到下…

二分查找专题(总)

1、经典二分查找模板 int search(vector<int>& nums, int target) {int right nums.size() - 1;int left 0;while(left < right){int mid (left right)/2;if(nums[mid] > target){right mid-1;}else if(nums[mid] < target){left mid1;}else {return…

c语言-经典例题

C语言-经典例题 一、单项选择题 1、 -- A 2、 -- C y<5 --是关系运算符的优先级大于&& -- 是逻辑运算符 3、 -- B - D选项&#xff1a;c是float类型&#xff0c;所以c/2是1.5 4、 -- C 从后往前执行&#xff08;先算后面的&a…

【uniapp】vue3+vite配置tailwindcss

安装 npm install autoprefixer tailwindcss uni-helper/vite-plugin-uni-tailwind -Dautoprefixer &#xff1a;自动管理浏览器前缀的插件&#xff0c;可以解析css文件并且添加前缀到css内容里。uni-helper/vite-plugin-uni-tailwind: 将 Tailwind CSS 框架集成到使用 Vite 作…

linux系统编程:多任务编程(进程1)

1.进程 进程:(进行中的程序)--正在运行的程序 (动态的) ---内存 程序的一次执行过程&#xff01; 一个程序一个程序 可以 对应多个进程 程序 -- a.out (可执行程序) ---静态的 程序 加载 到内存 运行起来 成为了 进程。 进程是 程序运行的实体。 程序 数据代码 2.进…

背包九讲(求方案数,求具体方案数,有依赖背包)

文章目录 求方案数基本思路代码 背包问题求具体方案基本思路代码 有依赖背包基本思路代码 求方案数 问题描述&#xff1a; 给定n nn个物品&#xff0c;以及一个容量大小为m mm的背包&#xff0c;然后给出n nn个物品的体积及价值&#xff0c;求背包最大价值是多少&#xff0c;也…

递归排序 归并排序 快排

递归 求中点 midL(R-L)/2 midL((R-L)>>1)右移一位更快 子问题等量 mast er公式 T(N) a*T(N/b)O(N^d) T(N):母 T(N/b)&#xff1a;子 &#xff08;是否等量&#xff09; a&#xff1a;调用多少次 O(N^d)&#xff1a;除去子变量之外的时间复杂度 子问题等量 上面…

sqli-labs-master靶场通关

目录 一、sqli-labs第一关 1.判断是否存在sql注入 &#xff08;1&#xff09;提示输入数字值的ID作为参数&#xff0c;输入?id1 &#xff08;2&#xff09;通过数字值不同返回的内容也不同&#xff0c;所以我们输入的内容是带入到数据库里面查询了 &#xff08;3&#xff0…

信号量和管道

一、信号量 实现模拟售票问题&#xff1a; 1、信号量的机制&#xff1a;描述可使用资源的个数。 &#xff08;1&#xff09;P操作&#xff1a;表示使用这个资源&#xff0c;资源个数减一 逻辑&#xff1a;尝试获取资源——有资源可用直接使用 | 无资源可用等待 如果信号量的…

面向新人的 Java 面试问题(101-150)

101.什么是多态&#xff1f; 多态性被定义为能够采用多种形式的能力。它有两种类型&#xff0c;即编译时多态性或方法重载 - 在编译时调用的函数。例如&#xff0c;以“面积”类为例。根据参数数量&#xff0c;它可以计算正方形、三角形或圆形的面积。运行时多态性或方法覆盖 …

【详细】linux 打包QT程序

【详细】linux 打包QT程序 一. 安装linuxdeployqt1.1 下载linuxdeployqt源码并修改如下 二. 安装patchelf三. 打包appimage四. 打包成 Debian包4.1 control文件内容4.2 postinst文件内容4.3 postrm文件内容4.4 打包命令4.4 安装命令4.5 卸载命令 一. 安装linuxdeployqt 下载地…

【Redis】Redis 数据类型与结构—(二)

Redis 数据类型与结构 一、值的数据类型二、键值对数据结构三、集合数据操作效率 一、值的数据类型 Redis “快”取决于两方面&#xff0c;一方面&#xff0c;它是内存数据库&#xff0c;另一方面&#xff0c;则是高效的数据结构。 Redis 键值对中值的数据类型&#xff0c;也…