# Pset3 - Find: I can't find what's wrong with my sorting algorithm...?

I have an issue with the "find" problem. When I test my program, it seems to get stuck in an infinite loop (nothing is prompted, there is just a blank space and I have to kill the program with ctrl c). I have read so many threads, tried many differents fixes, but nothing seems to work. I feel it's something in my sorting algorithm, but I'm not completely sure. Can anyone point me in the right direction? I'm really lost on this one!

Here is the searching algorithm:

#include <cs50.h>

#include "helpers.h"

int end, beg, mid;
bool search(int value, int values[], int n)
{
end = n-1;
beg = 0;
mid = (end + beg /2);

while (end >= beg)
{
if (values[mid] == value)
{
return true;
}

else if (values[mid] < value)
{
beg = mid + 1;
}

else
{
end = mid - 1;
}
}

return false;

}


And here is my selection sort algorithm, which I think is the one with the problem:

int small, swap;
void sort(int values[], int n)
{
for (int i=0; i <= n-2; i++)
{
small = i;

for (int j = i + 1; j < n; j++)
{
if (values[j] < values[small])
{
small = j;
}
}

if (small != i)
{
swap = values[small];
values[small] = values[i];
values[i] = swap;
}

}

return;

}


Thank you so much for your help, I'm really getting crazy on this one!

In search, move the calculation of mid into the loop, and make sure the /2 is outside the parentheses.

The sorting algorithm has no potential for an infinite loop, and looks correct.

Also, it's usually best to have as few global variables (declared outside of any function) as possible.

• Thank you!!! I feel stupid not thinking about it! And regarding your last remark, I'm not sure I understand, what variable could I make global? Mar 4 '17 at 18:27
• You have several variables like end that are declared outside of the function, therefore global, while there's no reason for making them global. Having many global variables might cause unmaintainable code. Mar 5 '17 at 0:22
• Ok I get it now! Thanks! Mar 6 '17 at 15:00

You have two problem 1- the calculation for division goes first so mid = (beg + end / 2) is actually doing this end/2 and the result will be add to beg 2- your mid point will always stay the same as you've assigned it out side the loop, you need it inside the loop so that every time you change the beg and end you update the mid as well

• Thank you so much! Mar 4 '17 at 18:28