Fortran学习23:数据结构和算法

在之前学习数组的时候,我就已经写了冒泡排序、希尔排序、选择排序、插入排序,今天先写一下快速排序(这个就不用看书了,我觉的书上讲的实在是太复杂):

快速排序:

基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

首先用数组的第一个数作为枢轴,然后将所有比它小的数都放到它的位置之前,所有比它大的数都放到它的位置之后,由此可以该“枢轴“记录最后所落的位置i作为分界线,将序列分割成两个子序列。这个过程称为一趟快速排序。

一趟快速排序的算法是:

​设置两个变量i、j,排序开始的时候:令i=0,j=length-1;

​以第一个数组元素作为枢轴,赋值给key,即key=array[0];

​从j开始向前扫描,找到第一个小于key的值array[j],将array[j]和array[i]的值交换;

​从i开始向后扫描,找到第一个大于key的值array[i],将array[i]和array[j]的值交换;

重复第3、4步,直到i==j,将枢轴元素移到正确位置上,即将key赋值给array[i]。

时间复杂度:快速排序在所有平均时间复杂度为(O(nlogn))的排序方法中,其性能最好。但是,若初始记录序列按关键字有序或基本有序时,快速排序将蜕化为冒泡排序,

recursive  subroutine quicksort(arr,low,upper)
    implicit none
    integer::arr(upper)
    integer low,upper,i,j,k
    if(low>=upper)then 
    RETURN
    end if
    k=arr(low)
    i=low
    j=upper
    do while(i<j)
        do while((arr(j)>=k).and.i<j)
            j=j-1
        end do
        arr(i)=arr(j)
        do while((arr(i)<k).and.i<j)
            i=i+1
        end do
        arr(j)=arr(i)
    end do 
    arr(i)=k
    call quicksort(arr,low,i-1)
    call quicksort(arr,i+1,upper)
end subroutine
program main
    implicit none
    integer::array(9)=(/1,4,2,5,1,9,3,7,5/)
    integer low,upper
    low=1
    upper=size(array, dim=1)
    write(*,"('original array:',I3,I3,I3,I3,I3,I3,I3,I3,I3)")array
    call quicksort(array,low,upper)
    write(*,"('after sort:',I3,I3,I3,I3,I3,I3,I3,I3,I3)")array
    stop "quick sort complete"
end program

输出也很简单的:

搜索方法:顺序搜索(暴力查找)、二分法、散列搜索、堆栈、树,这些csdn网站上都有很完备的c++代码和讲解,c++的好处就是你看完它之后,你就知道其他的语言应该怎么去写了,Java、python、尤其是Fortran,直接就是ctrl+c,ctrl+v,搬过来,改改格式就完全可以运行,所以我不想再写了,感觉没啥意义,就这样子吧,数据结构和算法就到这里啦,因为用不上Fortran的ims库,所以我就不搞了,Fortran的学习到今天就结束了,拜拜。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值