Infinite Loop problem in an array sorting program

Click For Summary
SUMMARY

The discussion centers on an infinite loop issue encountered in a Fortran function designed to partition an array based on a specified value, xmiddle. The original code uses two pointers, l and r, to rearrange the array elements, but fails to update these pointers correctly, leading to an infinite loop. A successful implementation in C++ demonstrates that adjusting the initial values of l and r to 0 and 15, respectively, resolves the issue and correctly partitions the array.

PREREQUISITES
  • Understanding of array manipulation in programming
  • Familiarity with Fortran and C++ syntax
  • Knowledge of pointer and index management in sorting algorithms
  • Basic concepts of partitioning in sorting algorithms
NEXT STEPS
  • Study the differences between Fortran and C++ array indexing
  • Learn about the QuickSort algorithm and its partitioning method
  • Investigate debugging techniques for infinite loops in programming
  • Explore the implementation of sorting algorithms in various programming languages
USEFUL FOR

Software developers, particularly those working with array algorithms, and programmers transitioning between Fortran and C++. This discussion is also beneficial for anyone troubleshooting infinite loops in sorting functions.

scothoward
Messages
28
Reaction score
0
Hi, I am writing a function that takes in a real data array and a key partition value, which will rearrange the array so that elements with a lower value than x are placed before the elements with values >= the partition value. It then returns the index of the last element of the array with a value less than the partition value.

We were given some pseudo-code which uses the idea that we start from the left and right and simultaneously switch elements using two loops excited together.

CODE
Code:
integer function partition_data( xdata, xmiddle )
    implicit none

   real, dimension(:) :: xdata
   real :: xmiddle !INTENT?

   integer ::  l = 1
   integer ::  r = 16
   real :: temp
  
    do
       if (xdata(l) < xmiddle) then
          if (l == r) then
             partition_data = l
             exit
          end if           
             l = l + 1        
       else        
          do
             if (xdata(r) >= xmiddle) then
                if (l == r) then
                   partition_data = l - 1
                   exit
                end if
              
                r = r - 1                        
             else              
                temp = xdata(l)
                xdata(l) = xdata(r)
                xdata(r) = temp
                exit 
             end if
          end do              
        
       end if
    end do
        
  end function partition_data

With the xdata array

xdata = (/ 0.00392, 0.0251, 0.453, 0.667, 0.963, 0.838, 0.335, 0.975, &
0.796, 0.833, 0.345, 0.871, 0.0899, 0.888, 0.701, 0.735 /)

The xmiddle was set to 0.5 in the main test program.

When I compile, I seem to get an infinite loop and I cannot find where it is.

If anyone can spot where I went wrong, that would be great.

Thanks in advance!
 
Last edited by a moderator:
Technology news on Phys.org
The OP hasn't been around for years, but in case others are interested, here's what I found. I implemented the code shown above in C++, and it worked without any problems. After the partition function returned, the array was ordered with all of the elements < 0.5 appearing before all those that were >= 0.5. The only changes I made were to replace the initial values of l and r with 0 and 15 respectively, since arrays in C/C++ are zero-based.

Without seeing the code you actually wrote, it's impossible to say why your code goes into an infinite loop.
My code:
C:
int partitionData(float xdata[], float xmiddle)
{
    int l = 0, r = 15;
    float temp;
    while (1)
    {
        if (xdata[l] < xmiddle)
        {
            if (l == r) return l;
            l++;          
        }
        else {
            if (xdata[r] >= xmiddle)
            {
                if (l == r) return l - 1;
                r--;
            }
            else
            {
                temp = xdata[l];
                xdata[l] = xdata[r];
                xdata[r] = temp;
            }
        }
    }
}
The partitionData() function returned 5.
Output with xmiddle set to 0.5. :
Code:
0.00392
0.0251
0.453
0.0899
0.345
0.335  << index 5, the last element of the array whose value is < xmiddle
0.838
0.975
0.796
0.833
0.963
0.871
0.667
0.888
0.701
0.735
 
Last edited:
  • Like
Likes   Reactions: sysprog

Similar threads

  • · Replies 7 ·
Replies
7
Views
3K
  • · Replies 17 ·
Replies
17
Views
4K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 6 ·
Replies
6
Views
3K
Replies
11
Views
2K
  • · Replies 8 ·
Replies
8
Views
4K
  • · Replies 4 ·
Replies
4
Views
3K
Replies
6
Views
6K
  • · Replies 20 ·
Replies
20
Views
2K
  • · Replies 5 ·
Replies
5
Views
4K