Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
## Searches
* [linear_search](/modules/searches/linear_search.f90)
* [recursive_linear_search](/modules/searches/recursive_linear_search.f90)
* [ternary_search](/modules/searches/ternary_search_module.f90)
## Sorts
* [bubble_sort](/modules/sorts/bubble_sort.f90)
* [recursive_bubble_sort](/modules/sorts/recursive_bubble_sort.f90)
Expand Down
4 changes: 2 additions & 2 deletions examples/maths/factorial.f90
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ program factorial_program
use factorial_module
implicit none

Print*, factorial(5)
Print*, recursive_factorial(5)
Print *, factorial(5)
Print *, recursive_factorial(5)

end program factorial_program
6 changes: 3 additions & 3 deletions examples/searches/example_linear_search.f90
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ program linear_search_program

integer, dimension(5) :: array

array = (/ 540, 6, 10, 100, 3 /)
array = (/540, 6, 10, 100, 3/)

!! Search for the number 6 in array.
print*, "Target = 6: ", linear_search(array, 6) !! Prints 2.
print *, "Target = 6: ", linear_search(array, 6) !! Prints 2.

!! Search for the number 5 in array.
print*, "Target = 5: ", linear_search(array, 5) !! Prints -1 because item 5 is not found.
print *, "Target = 5: ", linear_search(array, 5) !! Prints -1 because item 5 is not found.

end program linear_search_program
20 changes: 20 additions & 0 deletions examples/searches/example_ternary_search_array_based.f90
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
! Example Program: Array-based Ternary Search
! This program demonstrates how to use the array-based ternary search algorithm
! implemented in the `ternary_search` module to find a target element in a sorted array.

program example_ternary_search_array
use ternary_search
implicit none
integer :: result ! Holds the index of the found target
integer, dimension(10) :: arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] ! Sorted Test Array
integer :: target ! Target value to search for

target = 17
result = ternary_search_array(arr, target, 1, size(arr))

if (result /= -1) then
print *, "Target found at index:", result
else
print *, "Target not found."
end if
end program example_ternary_search_array
74 changes: 74 additions & 0 deletions examples/searches/example_ternary_search_function_based.f90
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
!> Example Program: Function-based Ternary Search for Minimum and Maximum
!!
!! Created by: Ramy-Badr-Ahmed (https://github.com/Ramy-Badr-Ahmed)
!! in Pull Request: #24
!! https://github.com/TheAlgorithms/Fortran/pull/24
!!
!! Please mention me (@Ramy-Badr-Ahmed) in any issue or pull request
!! addressing bugs/corrections to this file. Thank you!
!!
!! This program demonstrates how to use the function-based ternary search algorithm
!! from the `ternary_search` module to find the minimum and maximum of unimodal functions.

program ternary_search_function_based
use ternary_search
implicit none

! Define the variables
integer, parameter :: dp = kind(0.0d0) ! Define double precision kind
real(8) :: result_min, result_max ! Results for minimum and maximum values
real(8) :: min_point, max_point ! Points where minimum and maximum occur
real(8) :: left, right, tol ! Left and right bounds, and tolerance

interface
! Function with a minimum (example function - defined externally)
real(8) function f_min(x)
real(8), intent(in) :: x
end function f_min

! Function with a maximum (example function - defined externally)
real(8) function f_max(x)
real(8), intent(in) :: x
end function f_max
end interface

! The boundary values can vary depending on the problem context.
! In this example, they are chosen arbitrarily.
left = 0.0d0
right = 10.0d0

! The tolerance value defines how close the left and right bounds must be for the search to terminate.
tol = 1.0e-6_dp

! Call the ternary search to find the minimum point of f_min
min_point = ternary_search_minimum(f_min, left, right, tol)
result_min = f_min(min_point)

! Call the ternary search to find the maximum point of f_max
max_point = ternary_search_maximum(f_max, left, right, tol)
result_max = f_max(max_point)

print *, "Minimum of the function f_min is at x =", min_point, "with value =", result_min
print *, "Maximum of the function f_max is at x =", max_point, "with value =", result_max

end program ternary_search_function_based

! Define the unimodal function f_min with a minimum near x = 5.0
! The quadratic term (x - 5.0)**2 defines a parabola that is concave upward with a minimum at x = 5.0
! and values increasing as x moves away from 5.
! The cosine term introduces oscillations, affecting the exact location of the minimum slightly away from 5.0.

real(8) function f_min(x)
real(8), intent(in) :: x
f_min = (x - 5.0d0)**2 + cos(x) ! Example of a quadratic function with a cosine oscillation
end function f_min

! Define the unimodal function f_max with a maximum near x = 5.0
! The quadratic term -(x - 5.0)**2 defines a parabola that is concave downward with a maximum at x = 5.0
! and values decreasing as x moves away from 5.
! The cosine term introduces oscillations, affecting the exact location of the maximum slightly away from 5.0.

real(8) function f_max(x)
real(8), intent(in) :: x
f_max = -(x - 5.0d0)**2 + cos(x) ! Example of a quadratic function with a cosine oscillation
end function f_max
6 changes: 3 additions & 3 deletions examples/searches/recursive_linear_search.f90
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ program recursive_linear_search_example

integer, dimension(5) :: array

array = (/ 306, 1005, 5, 62, 0 /)
array = (/306, 1005, 5, 62, 0/)

!! Search for the number 62 in the array
print*, "Target = 62: ", recursive_linear_search(array, size(array), 62) !! Prints 4.
print *, "Target = 62: ", recursive_linear_search(array, size(array), 62) !! Prints 4.

!! Search for the number 10 in the array
print*, "Target = 10: ", recursive_linear_search(array, size(array), 10) !! Prints -1 because item 10 is not found.
print *, "Target = 10: ", recursive_linear_search(array, size(array), 10) !! Prints -1 because item 10 is not found.

end program recursive_linear_search_example
4 changes: 2 additions & 2 deletions examples/sorts/example_recursive_bubble_sort.f90
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ program recursive_bubble_sort_example
!! Fill the array with random numbers.
call random_number(array)

print*, "Before:", array
print *, "Before:", array

!! Bubble sort subroutine call.
call recursive_bubble_sort(array, size(array))

print*, "After:", array
print *, "After:", array

end program recursive_bubble_sort_example
4 changes: 2 additions & 2 deletions examples/sorts/example_usage_bubble_sort.f90
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ program bubble_sort_example
!! Fill the array with random numbers
call random_number(array)

print*, "Before:", array
print *, "Before:", array

!! Call the bubble_sort subroutine to sort the array
call bubble_sort(array)

print*, "After:", array
print *, "After:", array

end program bubble_sort_example
2 changes: 1 addition & 1 deletion examples/sorts/example_usage_gnome_sort.f90
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ program test_gnome_sort
integer :: n, i

! Initialize the test array
array = (/ -5, 2, 9, 1, 5, 6, -7, 8, 15, -20 /)
array = (/-5, 2, 9, 1, 5, 6, -7, 8, 15, -20/)
n = size(array)

! Call gnome_sort from the module to sort the array
Expand Down
2 changes: 1 addition & 1 deletion examples/sorts/example_usage_heap_sort.f90
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ program test_heap_sort
integer, dimension(n) :: array(n) ! Test array

! Initialize the test array
array = (/ 12, 11, 13, 5, 6, 7, 3, 9, -1, 2, -12, 1 /)
array = (/12, 11, 13, 5, 6, 7, 3, 9, -1, 2, -12, 1/)

! Print the original array
print *, "Original array:"
Expand Down
2 changes: 1 addition & 1 deletion examples/sorts/example_usage_merge_sort.f90
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ program test_merge_sort
integer :: n, i

! Initialize the test array
array = (/ -2, 3, -10, 11, 99, 100000, 100, -200 /)
array = (/-2, 3, -10, 11, 99, 100000, 100, -200/)
n = size(array)

! Call merge_sort from the module to sort the array
Expand Down
2 changes: 1 addition & 1 deletion examples/sorts/example_usage_quick_sort.f90
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ program test_quick_sort
integer :: n, i

! Initialize the test array
array = (/ 10, 7, 8, 9, 1, 5, -2, 12, 0, -5 /)
array = (/10, 7, 8, 9, 1, 5, -2, 12, 0, -5/)
n = size(array)

! Print the original array
Expand Down
6 changes: 3 additions & 3 deletions examples/sorts/example_usage_radix_sort.f90
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ program test_radix_sort

! Test for base 10
print *, "Testing Radix Sort with base 10:"
array = (/ 170, 45, 75, 90, 802, 24, 2, 66, 15, 40 /)
array = (/170, 45, 75, 90, 802, 24, 2, 66, 15, 40/)
n = size(array)
call radix_sort(array, n, base10)
print *, "Sorted array in base 10:"
Expand All @@ -23,7 +23,7 @@ program test_radix_sort

! Test for base 2
print *, "Testing Radix Sort with base 2:"
array = (/ 1010, 1101, 1001, 1110, 0010, 0101, 1111, 0110, 1000, 0001 /) ! Binary values whose decimal: (/ 10, 13, 9, 14, 2, 5, 15, 6, 8, 1 /)
array = (/1010, 1101, 1001, 1110, 0010, 0101, 1111, 0110, 1000, 0001/) ! Binary values whose decimal: (/ 10, 13, 9, 14, 2, 5, 15, 6, 8, 1 /)
n = size(array)
call radix_sort(array, n, base2)
print *, "Sorted binary array in Decimal:"
Expand All @@ -33,7 +33,7 @@ program test_radix_sort

! Test for base 16
print *, "Testing Radix Sort with base 16:"
array = (/ 171, 31, 61, 255, 16, 5, 211, 42, 180, 0 /) ! Hexadecimal values as decimal
array = (/171, 31, 61, 255, 16, 5, 211, 42, 180, 0/) ! Hexadecimal values as decimal
n = size(array)
call radix_sort(array, n, base16)
print *, "Sorted hexadecimal array in Decimal:"
Expand Down
4 changes: 2 additions & 2 deletions modules/maths/factorial.f90
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ function factorial(number) result(factorial_number)

factorial_number = 1
do while (counter > 1)
factorial_number = factorial_number * counter
factorial_number = factorial_number*counter
counter = counter - 1
end do

Expand All @@ -33,7 +33,7 @@ recursive function recursive_factorial(number) result(factorial_number)
if (number .lt. 1) then
factorial_number = 1
else
factorial_number = number * recursive_factorial(number - 1)
factorial_number = number*recursive_factorial(number - 1)
end if

end function recursive_factorial
Expand Down
2 changes: 1 addition & 1 deletion modules/searches/linear_search.f90
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ module linear_search_module

!! This function searches for a target in a given collection.
!! Returns the index of the found target or -1 if target is not found.
function linear_search (collection, target) result(target_index)
function linear_search(collection, target) result(target_index)
integer, dimension(:), intent(in) :: collection !! A collection for elements of type integer
integer, intent(in) :: target !! Target value to be searched.
integer :: target_index !! Target's index in the collection to return.
Expand Down
4 changes: 2 additions & 2 deletions modules/searches/recursive_linear_search.f90
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ recursive function recursive_linear_search(collection, index, target) result(tar
target_index = index
else
!! Recursively search in the remaining part of the collection
target_index = recursive_linear_search(collection, index-1, target)
target_index = recursive_linear_search(collection, index - 1, target)
end if

end function recursive_linear_search

end module recursive_linear_search_module
end module recursive_linear_search_module
Loading