fortran快速排序算法,示例对一维数组进行排序

news2024/9/21 12:39:52

fortran快速排序算法,示例对一维数组进行排序

  • 0. 引言
  • 1. 快速排序方法(QuickSqrt)代码实现
  • 2. 结语


0. 引言

  快速排序(QuickSort)是一种常用的排序算法,采用分治策略实现。它的基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分小。然后对这两部分数据分别进行递归排序,最后将两部分数据合并起来。

具体步骤如下

  1. 选择一个基准元素(pivot),通常选择数组的第一个元素。

  2. 将数组分成两部分,使得左边的元素都小于等于基准元素,右边的元素都大于等于基准元素。这个过程称为分区(partition)。

  3. 对左边的子数组和右边的子数组分别进行递归调用快速排序。

  4. 最后将左边的子数组、基准元素和右边的子数组合并起来。

  步骤2中的分区可以使用多种方式实现,其中一种常用的方式是通过两个指针(i和j)从数组的两端开始,i从左开始往右移动,j从右开始往左移动。当遇到左边的元素大于基准元素并且右边的元素小于基准元素时,交换这两个元素。不断移动指针直到i和j相遇,然后将基准元素和指针相遇位置的元素交换

  快速排序的时间复杂度为O(nlogn),其中n为数组的长度。最坏情况下的时间复杂度为O(n^2),发生在数组已经有序的情况下。为了避免最坏情况发生,可以选择随机选取基准元素。

  快速排序是一种原地排序算法,即不需要额外的辅助空间。

  本篇基于Fortran代码对上述流程进行实现,参考了网上的一些文章,下面是示例代码及主要过程实现。

1. 快速排序方法(QuickSqrt)代码实现

  下面是快速排序算法实现过程示例代码,主要算法在module文件中,示例实现了对一维数组的排序。

! 调用快速排序函数示例代码

program main
    use, intrinsic ::  iso_fortran_env
    use base_math
    real(real64),allocatable :: array(:),array2(:),array3(:)
    real(real64) :: t_beg,t_end,t_sample
    integer(int32) :: i
    
    allocate( array(12) ) ! 假定数组长度为12
    call random_seed
    call random_number(array) ! 生成随机数组
    
    array2 = array
     
    call cpu_time(t_beg)
    call QuickSort(array) !> 快速排序
    call cpu_time(t_end)
    
    t_quick = t_end - t_beg ! 计时
    print *,"    排序前  ","    排序后"
    do i = 1, size(array2)
        write(*, '(f12.7,1X,f12.7,1X,f12.7)')array2(i),array(i)
    enddo

   快速排序结果展示:


! module文件,存储快速排序的函数体

module base_math
use, intrinsic ::  iso_fortran_env
implicit none
    
contains  

! quickSort 算法
recursive subroutine QuickSort(Array)
 implicit none
 real(real64), intent(in out), dimension(:) :: Array
 integer(int32) :: index
 
 if(size(Array) <= 1) return
 call Partition(Array, index)
 call QuickSort(Array(:index-1))
 call QuickSort(Array(index:))
end subroutine QuickSort

! 分区过程
subroutine Partition(Array, marker)
 implicit none
 real(real64), intent(in out), dimension(:) ::Array
 integer(int32), intent(out) :: marker
 integer(int32) :: i, j
 real(real64) :: temp
 real(real64) :: pivot      ! pivot point
 
 pivot = Array(1)
 i= 0
 j= size(Array) + 1
 do
     j = j-1
     do
         if (Array(j) <= pivot) exit
         j = j-1
     end do
     i = i+1
     do
         if (Array(i) >= pivot) exit
         i = i+1
     end do
     if (i < j) then
         temp = Array(i)
         Array(i) = Array(j)
         Array(j) = temp
     elseif (i == j) then
         marker = i+1
         return
     else
         marker = i
         return
     endif
 end do
end subroutine Partition

end module base_math

2. 结语

   本篇分享了基于fortran快速排序的方法,能够实现对一维数组的排列。希望有所帮助






😜
😜😜
😜😜😜😜

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

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

相关文章

[笔试训练](三十六)106:提取不重复的整数107:哈夫曼编码108:abb

目录 106:提取不重复的整数 107:哈夫曼编码 108:abb 106:提取不重复的整数 题目链接:提取不重复的整数_牛客题霸_牛客网 (nowcoder.com) 题目: ​ 题解: #include <iostream> #include <string> using namespace std; int n0; int cnt[10]; int ret0; int mai…

MySQL CONCAT函数的简单使用

CONCAT函数用于将mysql中查询多列的值拼成一列显示&#xff0c; 使用示例&#xff1a; SELECT CONCAT(attr_name,"&#xff1a;",attr_value) FROM pms_sku_sale_attr_value WHERE sku_id1; 上面SQL语句使用CONCAT函数将attr_name、attr_value两列的值拼成一列&am…

【代码随想录】【算法训练营】【第62天】 [卡码108]冗余连接 [卡码109]冗余连接II

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 62&#xff0c;又是一个周一&#xff0c;ding~ 题目详情 [卡码108] 冗余连接 题目描述 卡码108 冗余连接 LeetCode类似题目684 冗余连接 解题思路 前提&#xff1a; 思路&#xff1a; 重点&a…

如何对odoo17网站cookies进行配置(How to configure cookies for Odoo 17 website?)

浏览器cookies具有缓存和加速的作用&#xff0c;odoo17 website 模块内置了cookies的选项: &#xff08;Browser cookies have the function of caching and acceleration, and the Odoo 17 website module has built-in options for cookies:&#xff09; 1、安装website模块后…

TCP传输控制协议

传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;由IETF的RFC 793[1]定义。 TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机…

【C++】哈希表的模拟实现及 unordered_set 和 unorderded_map 的封装

目录 前言一、哈希表的模拟实现1.1 哈希表的改造1.1.1 模板参数列表的改造1.1.2 增加迭代器操作 1.2 哈希表的模拟实现1.2.1 哈希表中仿函数的实现1.2.2 哈希表中节点类的实现1.2.3 哈希表中迭代器类的实现1.2.4 哈希表中构造函数、析构函数和 Clear() 函数的实现1.2.5 哈希表中…

JZ62 孩子们的游戏(圆圈中最后剩下的数)

题目来源&#xff1a;牛客 题目描述&#xff1a; 每年六一儿童节&#xff0c;牛客都会准备一些小礼物和小游戏去看望孤儿院的孩子们。其中&#xff0c;有个游戏是这样的&#xff1a;首先&#xff0c;让 n 个小朋友们围成一个大圈&#xff0c;小朋友们的编号是0~n-1。然后&…

Git 课程任务

** ** https://github.com/InternLM/Tutorial/pull/905 https://github.com/onlyzer0/all_you_need/blob/main/README.md

Dify中固定递归字符文本分割器的chunk长度计算方式

本文主要从源码角度剖析了Dify中FixedRecursiveCharacterTextSplitter的chunk长度计算方式。 1.self._length_function(chunk) 源码位置:dify\api\core\splitter\fixed\_text\_splitter.py\FixedRecursiveCharacterTextSplitter类\split\_text方法\self.\_length\_function(…

实验9 存储过程与函数的创建管理实验

一、实验目的&#xff1a; 理解存储过程和函数的概念。掌握创建存储过程和函数的方法。掌握执行存储过程和函数的方法。掌握游标的定义、使用方法。 二、实验内容 1&#xff0e;某超市的食品管理的数据库的Food表&#xff0c;Food表的定义如表所示&#xff0c; Food表的定义…

GESP 2023年12月C++二级真题

参考程序1&#xff1a; #include<iostream> using namespace std;int first,second; int m,n; int sum 0;int fn(int n) {if(n1) {return first;} else if (n2) {return second;} else {return fn(n-1)fn(n-2);} } int main() {cin>>first>>second;cin>…

【Golang】map的使用

map声明的方式 //声明var m map[string]string//在使用map之前&#xff0c;先make&#xff0c;make的作用就是给map分配空间m make(map[string]string)m["lover"] "Yzx"m["friend1"] "Zxw"m["friend2"] "Zzc"…

【电子通识】什么是无源元件的认证用可靠性试验标准AEC-Q200?

目前电动汽车已经是一个大趋势&#xff0c;汽车上安装有由多个电子零部件构成的ECU&#xff08;电子控制单元&#xff09;。即使汽车在恶劣的环境下行驶&#xff0c;电子零部件也必须不出故障地正常工作。因此&#xff0c;车载电子零部件与消费类电子相比&#xff0c;要求其达到…

Idea调试Kotlin代码

1.配置java虚拟机jvm远程调试 例如 启动程序配置 java -agentlib:jdwptransportdt_socket,servery,suspendn,address127.0.0.1:5005 -jar KtTest.jar IDEA配置远程调试JVM idea编译的Kt代码为 // IntelliJ API Decompiler stub source generated from a class file // Im…

人工智能是帮助开发人员还是取代他们?

最近&#xff0c;神经网络已经成为应用开发中不可或缺的工具。它们大大简化和加速了这一过程。 例如&#xff0c;使用GitHub Copilot&#xff0c;可以根据任务描述自动生成重复的代码部分。神经网络可以创建和运行测试&#xff0c;识别错误&#xff0c;甚至提出修复错误的方法…

数据库管理软件Navicat Premium介绍

1、点击连接 2、主界面 3、软件版本 待续...

【ZYNQ】VDMA 的使用

VDMA, Video Direct Memory Access 是 Xilinx 官方提供的高速内存存取 IP,采用 AXI4-Stream 与 AXI4 协议实现存储映射接口(Memory Map)与非存储映射接口(Non-Memory Map)接口的转换,主要用于视频数据缓存,同时提供帧缓存与帧同步控制功能。本文主要介绍 AXI VDMA 的配置…

博客文章多平台发布工具

做过博客分享和自媒体的同学应该都知道&#xff0c;在多个平台上同步发布、更新自己的原创内容&#xff0c;是快速传播知识、提高用户触达率的有效方式。 然而&#xff0c;一篇文章要在N个平台上重复进行编辑、排版、图片/视频上传的苦恼&#xff0c;你一定经历过吧&#xff1…

字符串哈希详解,单hash,双hash,滚动哈希

一、字符串哈希 1.1 基本概念 字符串哈希 将不同的字符串映射成不同的整数。 思想&#xff1a;将字符串映射成一个 p进制数字。 我们定义如下哈希函数&#xff1a; h a s h ( s ) ∑ i 1 n s [ i ] p n − i ( m o d M ) 其中 s 为长度为 n 的字符串&#xff0c;下标从…

自动驾驶中,实现三维点旋转原理

文章目录 1. 三维点旋转的方案2. 使用复数表示二维点的旋转2.1. 复数的概念2.2. 复数的三种形式及相互转换2.3. 复数概念扩展&#xff1a;实数、虚数、复数 3. 四元数旋转三维点原理4. 使用四元数进行旋转的公式5. 旋转叠加6. 四元数转换为三维点7. 代码实现 1. 三维点旋转的方…