算法设计(二)

news/2024/9/18 23:06:34/ 标签: 算法, java, 排序算法

1.归并排序

介绍

归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并

算法实现

package com.practice.java;import java.util.Scanner;
public class Example1 {//合并子序列static void Merge(int c[],int left,int mid,int right){int [] d = new int[right - left + 1];int i,j,k=0,cunt;i = left;j = mid + 1;while (i <= mid && j <= right) {if (c[i] <= c[j]) {d[k++] = c[i++];} else {d[k++] = c[j++];}}//前子序列先结束while(j <= right) {d[k++] = c[j++];}//后子序列先结束while(i <= mid) {d[k++] = c[i++];}for(cunt = 0,i = left;i <= right;cunt++,i++) {c[i] = d[cunt];}}//划分子序列static void MergeSort(int a[],int left,int right) {if(left<right) {int mid = (left + right) / 2;MergeSort(a,left,mid);MergeSort(a,mid + 1,right);for(int i = 0;i < right+1;i++) {System.out.print(a[i] +" ");}System.out.println();Merge(a,left,mid,right);}}public static void main(String[] args) {int n,i;System.out.print("请输入数组的规模:");Scanner scanner = new Scanner(System.in);n = scanner.nextInt();int [] num = new int[n];System.out.print("请输入要排序" + n + "的个元素: ");for(i = 0;i < n;i++) {num[i] = scanner.nextInt();}System.out.print("排序前" + n + "的个元素:");for(i = 0;i < n;i++) {}System.out.println();MergeSort(num,0,n-1);System.out.print("排序后" + n + "的个元素:");for(i = 0;i < n;i++) {System.out.print(num[i] +" ");}scanner.close();}}

2.快速排序

介绍

快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。

算法实现

package com.practice.java;import java.util.Scanner;public class Example2 {public static int partion(int num[],int left,int right) {int i = left,j = right + 1;do {do i++;while(num[i] < num[left]);do j--;while(num[j] > num[left]);if(i < j) {int t = num[i];num[i] = num[j];num[j] = t;}}while(i < j);//i>j时,交换分界元素与主元int t = num[left];num[left] = num[j];num[j] = t;return j;}public static void quickSort(int num[],int x,int y) {if(x < y) {int m = partion(num,x,y);quickSort(num,x,m - 1);quickSort(num,m + 1,y);}}public static void main(String[] args) {int n,i;System.out.print("请输入数组的规模:");Scanner scanner = new Scanner(System.in);n = scanner.nextInt();int [] num = new int[n];System.out.print("请输入要排序" + n + "的个元素: ");for(i = 0;i < n;i++) {num[i] = scanner.nextInt();}System.out.print("排序前" + n + "的个元素:");for(i = 0;i < n;i++) {System.out.print(num[i] +" ");}System.out.println();quickSort(num,0,n-1);System.out.print("排序后" + n + "的个元素:");for(i = 0;i < n;i++) {System.out.print(num[i] +" ");}scanner.close();}}

3.折半查找

介绍

折半查找法是效率较高的一种查找方法。
假设有已经按照从小到大的顺序排列好的五个整数a0~a4,要查找的数是X,
其基本思想是: 设查找数据的范围下限为l=0,上限为h=4,求中点m=(l+h)/2,用X与中点元素am比较,若X等于am,即找到,停止查找;否则,若X大于am,替换下限l=m+1,到下半段继续查找;若X小于am,换上限h=m-1,到上半段继续查找;
1如此重复前面的过程直到找到或者l>h为止。如果l>h,说明没有此数,打印找不到信息,程序结束。
该方法是查找的范围不断缩小一半,所以查找效率较高

算法实现

package com.practice.java;import java.util.Scanner;
public class Example3 {static int chack(int[] a,int low,int high,int key) {if(high - low == 0) {if(key == a[low]) {return low + 1;}else {return -1;}}else {int mid = (high + low) / 2;if(a[mid] == key) {return mid + 1;}else {if(key < a[mid]) {return chack(a,low,mid,key);}else {return chack(a,mid + 1,high,key);}}}}public static void main(String[] args) {int[] a = {-7,-2,0,15,27,54,80,88,102};//查找值int key;System.out.print("请输入查找的数字:");Scanner scanner = new Scanner(System.in);key = scanner.nextInt();System.out.println("查找到返回key在数组中的位置 || 找不到返回-1");System.out.println(chack(a,0,8,key));	scanner.close();}}

4.选择问题

介绍

选择问题是求一个n个数列表的第k个最小元素的问题。这个数字被称为第k个顺序统计量。当然,对于k=1或者k=n的情况,我们可以扫描整个列表,找出最小或者最大的元素。对于其他情况,我们可以对列表进行排序,然后返回第k个元素。

算法实现

package com.practice.java;import java.util.Scanner;
public class Example4 {public static int partion(int num[],int left,int right) {int i = left,j = right + 1,t;do {do i++;while(num[i] < num[left]);do j--;while(num[j] > num[left]);if(i < j) {t = num[i];num[i] = num[j];num[j] = t;}}while(i < j);//i>j时,交换分界元素与主元t = num[left];num[left] = num[j];num[j] = t;return j;}static int select(int[] a,int left,int right,int key) {int j;j = partion(a,left,right);if(key == (j -left + 1)) {return a[j];}else {if(key > j -left + 1) {return select(a,j+1,right,key - (j -left + 1));}else {return select(a,left,j - 1,key);}}}public static void main(String[] args) {int[] a = {41,76,55,19,59,63,12,47,67};//查找第几小的数int key;System.out.print("请输入查找第几小的数字:");Scanner scanner = new Scanner(System.in);key = scanner.nextInt();System.out.println("查找到返回在数组中对应的数 || 超出查找范围返回-1");System.out.println(select(a,0,8,key));	scanner.close();}
}

5.最大字段求和

介绍

给出一些数,计算这些数能达到的最大值

算法实现

package com.practice.java;
public class Example5 {static int maxsum(int a[],int left,int right) {int maxsum,mid,leftsum,rightsum,midsum,i,j;if(left == right) {return left;}else {mid = (left + right) / 2;leftsum = maxsum(a,left,mid);rightsum = maxsum(a,mid + 1,right);int leftsum1 = 0;int lefts = 0;for(i = mid;i >= left;i--) {lefts = lefts + a[i];if(lefts > leftsum1) {leftsum1 = lefts;}}int rightsum1 = 0;int rights = 0;for(j = mid + 1;j <= right;j++) {rights = rights + a[j];if(rightsum1 < rights) {rightsum1 = rights;}}midsum = leftsum1 +rightsum1;maxsum = rightsum;maxsum = (rightsum > midsum)? rightsum:midsum;maxsum = (maxsum > leftsum)?maxsum:leftsum;return maxsum;}}public static void main(String[] args) {int a[] = {-5,11,-4,13,-4,-2};System.out.println("最大字段和为:" + maxsum(a,0,5));}}

6.棋盘覆盖问题

介绍

将含有特殊方格且具有一定规格的棋盘用各种 L 型方格覆盖

算法实现

package com.practice.java;import java.util.Scanner;
public class Example6 {static int title = 1;//记录骨牌的型号static int [][] board = new int[20][20];//存储棋盘被覆盖的情况static void ChessBoard(int tr,int tc,int dr,int dc,double size) {int t = 0;int s;if(size == 1)return;t = title++;s = (int) (size / 2);//划分棋盘//覆盖左上角棋盘if(dr < (tr+s) && dc < (tc+s)) {//特殊方格在棋盘左上角ChessBoard(tr,tc,dr,dc,s);}else {board[tr + s - 1][tc + s -1] = t;ChessBoard(tr,tc,tr + s - 1,tc + s - 1,s);}//覆盖右上角棋盘if(dr<tr+s && dc >= tc+s) {ChessBoard(tr,tc+s,dr,dc,s);}else {board[tr + s - 1][tc + s] = t;ChessBoard(tr,tc + s,tr + s - 1,tc + s,s);}//覆盖左下角棋盘if(dr >= tr+s && dc < tc+s) {ChessBoard(tr+s,tc,dr,dc,s);}else {board[tr + s][tc + s - 1] = t;ChessBoard(tr+s,tc,tr+s,tr+s-1,s);}//覆盖右下角棋盘if(dr >= tr+s && dc >= tc+s) {ChessBoard(tr+s,tc+s,dr,dc,s);}else {board[tr + s][tc + s] = t;ChessBoard(tr+s,tc+s,tr+s,tr+s,s);}}public static void main(String[] args) {int k,x,y,i,j;Scanner scanner = new Scanner(System.in);System.out.println("请输入棋盘的规模K(2**k):");k = scanner.nextInt();System.out.println("请输入特殊方格的下标x,y:");x = scanner.nextInt();y = scanner.nextInt();ChessBoard(0,0,x,y,Math.pow(2,k));for(i = 0;i < Math.pow(2,k);i++) {for(j = 0;j < Math.pow(2,k);j++) {System.out.print(board[i][j] + " ");}System.out.println();}scanner.close();}
}

http://www.ppmy.cn/news/1525666.html

相关文章

【人工智能学习笔记】4_4 深度学习基础之生成对抗网络

生成对抗网络&#xff08;Generative Adversarial Network, GAN&#xff09; 一种深度学习模型&#xff0c;通过判别模型&#xff08;Discriminative Model&#xff09;和生成模型&#xff08;Generative Model&#xff09;的相互博弈学习&#xff0c;生成接近真实数据的数据分…

leecode100题-双指针-三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 答案中不可以包含重复的三元组。 示例 1&#xff1a; 输入…

【Hot100】LeetCode—169. 多数元素

目录 1- 思路题目识别技巧 2- 实现⭐136. 只出现一次的数字——题解思路 3- ACM 实现 原题链接&#xff1a;169. 多数元素 1- 思路 题目识别 识别1 &#xff1a;统计数组中出现数量多余 [n/2] 的元素 技巧 值相同&#xff0c;则对 count 1&#xff0c;如果不相同则对值进行…

线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析

文章目录 1.特征值和特征向量1.1 特征值和特征向量的定义1.2 特征值和特征向量的求法1.3 特征值特征向量的主要结论 2.相似2.1 相似的定义2.2 相似的性质2.3 相似的结论 3.相似对角化4.实对称矩阵4.1 实对称矩阵的基本性质4.2 施密特正交化 5.重难点题型总结5.1 判断矩阵能否相…

D - 1D Country(AtCoder Beginner Contest 371)

题目链接: D - 1D Country (atcoder.jp) 题目描述: 数据范围: 输入输出: 题目分析: 典型的l, r 区间问题&#xff0c;即是前缀和问题&#xff0c;但是注意到数据范围, 数据范围1e-9 到 1e9 数据范围&#xff0c;要是从最小到最大直接for循环去模拟的话&#xff0c;时间复杂度…

使用iperf3测试局域网服务器之间带宽

文章目录 一、下载安装1、windows2、centos 二、使用0、参数详解1、centos 一、下载安装 1、windows https://iperf.fr/iperf-download.php 拉到最下面选最新版&#xff1a; 2、centos yum install iperf3二、使用 0、参数详解 服务器或客户端&#xff1a; -p, --port #…

Python+Pytest框架,“api_key.py文件怎么编写“?

1、在"api_keyword"文件夹下新增"api_key.py" import allure import requests import json import jsonpath from deepdiff import DeepDifffrom config import *allure.title("测试用例执行") class ApiKey:allure.step(">>>:开…

HTTP 协议和 APACHE 服务

WEB 服务基础 Internet 因特网 因特网是 Internet 的中文译名 在 20 世纪 60 年代&#xff08;冷战时期&#xff09;&#xff0c;美国国防部高等研究计划署&#xff08;ARPA&#xff09;出于军事上的目的&#xff0c;建立了 ARPA 网络&#xff0c;该网络由四个分布在不同地方…

大数据新视界 --大数据大厂之Kafka消息队列实战:实现高吞吐量数据传输

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

商务办公tips1:如何将网页转换为pdf

​ 场景需求&#xff1a; 商务轻办公人士获取网页内容&#xff0c;并且最好是pdf版本&#xff1f; 将网页转换为PDF的需求可能出现在多种场景中&#xff0c;以下是一些可能的情况&#xff1a; 学术研究&#xff1a;研究人员可能需要将某个学术网站的全文内容保存为PDF格式&a…

设计模式 20 状态模式

设计模式 20 创建型模式&#xff08;5&#xff09;&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式&#xff08;7&#xff09;&#xff1a;适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式&#xff…

使用 RabbitMQ 实现秒杀订单系统的异步消息处理

使用 RabbitMQ 实现秒杀订单系统的异步消息处理 在秒杀系统中&#xff0c;如何确保高并发环境下的订单处理稳定高效是个很大的挑战。为了解决这个问题&#xff0c;我们通常会引入消息队列&#xff0c;通过异步处理来削峰填谷。这篇文章将详细讲解如何使用 RabbitMQ 来设计一个…

Linux通过特定端口查看服务是否启动

Linux通过特定端口查看服务是否启动 你可以使用netstat或ss命令来检查特定端口上的服务。例如&#xff0c;使用ss -tuln | grep <端口号>来查看端口是否被占用。 netstat 你可以使用以下命令来查看特定端口上的服务&#xff1a; netstat -tuln | grep <端口号>…

VPP -LB 命令配置

【组网拓扑】 ping --> 2 1.1.1.3 【1.1.1.1 lb 2.2.2.2】 - 1.1.1.2 - 1.1.1.4 【GRE方式配置】 set interface state GigabitEthernet0/8/0 up set interface ip address GigabitEthernet0/8/0 1.1.1.1/24 lb conf ip4-src-addr…

看Threejs好玩示例,学习创新与技术(二)

本文接上篇内容&#xff0c;继续挖掘应用ThreeJS的一些创新算法。 本文理解难度比较大&#xff0c;可以先看一些概念&#xff0c;在难的地方培养一些意识即可。 1、扭曲的自然 下面图本身是矩形的&#xff0c;为何它可以这么扭曲呢&#xff1f;它在随机处带有一定的规律&…

Android - NDK:在Jni中打印Log信息

在Jni中打印Log信息 1、在配置CMakeLists.txt find_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log)# Specifies libraries CMake should link to your target library. You # can link…

laravel 资源show方法问题

有张admin_users表&#xff0c;但是在控制器的show方法返回的数据时空。 路由 Route::resource(adminuser, \App\Http\Controllers\AdminUserController::class)->except([create, edit]); 解决&#xff1a; 把路由adminuser 改成 admin-user Route::resource(admin-user, …

深度学习:怎么看pth文件的参数

.pth 文件是 PyTorch 模型的权重文件&#xff0c;它通常包含了训练好的模型的参数。要查看或使用这个文件&#xff0c;你可以按照以下步骤操作&#xff1a; 1. 确保你有模型的定义 你需要有创建这个 .pth 文件时所用的模型的代码。这意味着你需要有模型的类定义和架构。 2. …

【刷题】Day4--密码检查

Hi&#xff01; 今日刷题&#xff0c;小白一枚&#xff0c;欢迎指导 ~ 【链接】 密码检查_牛客题霸_牛客网 【思路】 依次根据规则判断密码是否合格。while里嵌套个for循环&#xff0c;来进行密码的多组输入&#xff0c;for循环进行一次代表判断一个密码串&#xff1b;规则…

灌区信息化发展趋势展望

灌区信息化作为现代农业发展的重要组成部分&#xff0c;正逐渐成为提升水资源管理效率、保障粮食安全与促进农业可持续发展的关键途径。随着信息技术的飞速进步和智能化技术的广泛应用&#xff0c;灌区信息化的未来发展趋势展现出多维度、深层次的变革与创新&#xff0c;其发展…