C Programming: Creating recursive quickSort function

AI Thread Summary
The discussion focuses on troubleshooting a recursive quickSort function in C programming, specifically for sorting a student struct array by the numDays attribute. The original poster struggles with the sorting logic and receives feedback highlighting the importance of the swap function, which is not provided. Concerns are raised about handling cases where array[j].numDays equals array[start].numDays, potentially leading to infinite recursion. Ultimately, the issue was identified as stemming from the sort function itself, leading to a resolution and a positive reflection on the programming process. The conversation underscores the challenges and satisfaction of debugging code.
cubanmissile
Messages
5
Reaction score
0

Homework Statement


Function:
Code:
void quickSort(struct student *array, int start, int end) {

	int i = start;
	int j = end;

	while(i < j) {

		// Move left counter, then right counter.
		while(i <= end && array[i].numDays <= array[start].numDays)
			i++;

		while(array[j].numDays > array[start].numDays)
			j--;

		if(i < j)
			swap(array, i, j);

	}

	swap(array, start, j);

	if(array[j].numDays < array[start].numDays)
		quickSort(array, 0, j);
	if(array[j].numDays > array[end].numDays)
		quickSort(array, j, end);

}


Homework Equations


None


The Attempt at a Solution


I have tried many different versions. Changing the variables from array[j] to array > array[start], as well as changing the bottom statement. This doesn't correctly sort the array however... Is there something I am missing? Look at this, I would *assume* it would work.

Here's why:

First, it increases the left index...then the right. Once all that's done and the elements are swapped, it checks to see if the element on the right index is larger than the element at the left index. If so, run quickSort again. Then after that recursive call, it then checks to the right of the partition element. If it's larger than the end element, recursively call until it is not.

So, why would it not be working?
 
Physics news on Phys.org
Use debugger or add a call to a function that will display the content of the sorted table, this way you will see for yourself what is happening and where the function does something different than you think it does.
 
A couple of things that come to mind:
1) You don't show the code for your swap function. Without seeing it, I can't tell if it's working correctly.

2) In this code --
Code:
if(array[j].numDays < array[start].numDays)
   quickSort(array, 0, j);
if(array[j].numDays > array[end].numDays)
   quickSort(array, j, end);
what happens if array[j].numDays == array[start].numDays?
 
Mark44 said:
A couple of things that come to mind:
1) You don't show the code for your swap function. Without seeing it, I can't tell if it's working correctly.

2) In this code --
Code:
if(array[j].numDays < array[start].numDays)
   quickSort(array, 0, j);
if(array[j].numDays > array[end].numDays)
   quickSort(array, j, end);
what happens if array[j].numDays == array[start].numDays?

Actually, it was my sort function that was causing the quickSort to not work. :) Thank you guys very much for the help! Programming is fun (not sarcasm, I truly love programming)!
 
cubanmissile said:
Actually, it was my sort function that was causing the quickSort to not work. :) Thank you guys very much for the help! Programming is fun (not sarcasm, I truly love programming)!

I think so, too. It's very satisfying to write some code (that typically has a few bugs in it), and then figure out why it's not doing what you want it to do.
 
Mark44 said:
I think so, too. It's very satisfying to write some code (that typically has a few bugs in it), and then figure out why it's not doing what you want it to do.

And then realizing that approach you took could never, ever yield what you wanted and you have to start again. Very satisfying indeed :-p
 

Similar threads

Replies
21
Views
3K
Replies
9
Views
4K
Replies
4
Views
5K
Replies
5
Views
2K
Replies
4
Views
2K
Replies
15
Views
2K
Back
Top