在之前学习数组的时候,我就已经写了冒泡排序、希尔排序、选择排序、插入排序,今天先写一下快速排序(这个就不用看书了,我觉的书上讲的实在是太复杂):
快速排序:
基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
首先用数组的第一个数作为枢轴,然后将所有比它小的数都放到它的位置之前,所有比它大的数都放到它的位置之后,由此可以该“枢轴“记录最后所落的位置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的学习到今天就结束了,拜拜。