<p>This is what I have so far. It compiles and runs fine just does not give me t
ID: 3623780 • Letter: #
Question
<p>This is what I have so far. It compiles and runs fine just does not give me the order I exspect i.e in alphabetical order.</p><p>// HeapSort.cpp : main project file.<br /><br />#include <stdafx.h><br />#include <iostream><br />#include <string><br />#include <stdlib.h><br />#using <mscorlib.dll><br /><br />using namespace std;<br /><br />template<typename T, int size><br />int GetArrLength(T(&)[size]){return size;}<br /><br />void moveDown(string *starTrekCharacters, int start, int count)<br />{<br />    int daRoot = start;<br />    int daChild;<br /><br />    while (daRoot * 2 + 1 < count) <br />    {<br />        daChild = daRoot * 2 + 1;<br /><br />        if (daChild < count - 1 && starTrekCharacters[daChild] < starTrekCharacters[daChild + 1]) <br />        {<br />            <br />            daChild = daChild + 1;<br /><br />        }<br /><br />        if (starTrekCharacters[daRoot] < starTrekCharacters[daChild]) <br />        {<br />            <br />            swap(starTrekCharacters[daRoot], starTrekCharacters[daChild]);<br /><br />                daRoot = daChild;<br />        <br />        <br />        }<br />        else{<br />    <br /><br /><br />        return;<br /><br />        }<br />        <br />    }<br />    return;<br />}<br /><br />void heapSort(string starTrekCharacters[], int numberOfItems)<br />{<br />  int start = numberOfItems / 2 - 1; <br /><br />  int end = numberOfItems - 1;<br />    <br />    while(start >= 0)<br />   {<br />            <br />            moveDown(starTrekCharacters,start,numberOfItems);<br /><br />            start = start - 1;<br /><br /><br />        while(end > 0)<br />        {<br /><br />                swap(starTrekCharacters[end], starTrekCharacters[0]);<br />                moveDown(starTrekCharacters,end,numberOfItems);<br />                end = end - 1;<br /><br />        }<br /><br />    }<br />    return;<br /> <br />}<br /><br />void printItems(string characters[], int numberOfItems)<br />{<br />   for (int i=0; i < numberOfItems; i++)<br />   {<br />      cout << characters[i] << endl;<br />   }<br />   cout << endl;<br /><br />   return;<br />}<br /><br />int main(int argc, char **argv)<br />{<br />   string starTrekCharacters[] = {<br />        "c", "b", "D", "a"<br />     };<br />  <br />   int numberOfCharacters = GetArrLength(starTrekCharacters);<br />  <br />   // Print the unsorted items<br />   cout << "Items unsorted:" << endl; <br />   printItems(starTrekCharacters, numberOfCharacters);<br /><br />   // Sort the items<br />   heapSort(starTrekCharacters, numberOfCharacters);<br /><br />   // Print the sorted items<br />   cout << "Items sorted:" << endl; <br />   printItems(starTrekCharacters, numberOfCharacters);<br />   <br />   system("PAUSE");<br />   <br />   return 0;<br />}</p>
Explanation / Answer
Figured it out. Everyone else enjoy!
// HeapSort.cpp : main project file.
#include <stdafx.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#using <mscorlib.dll>
using namespace std;
template<typename T, int size>
int GetArrLength(T(&)[size]){return size;}
void moveDown(string *starTrekCharacters, int start, int count)
{
while (2 * start + 1 < count)
{
int largest = start;
//If the child has a sibling and the child's value is less than its sibling's
if (strcmp(starTrekCharacters[largest].c_str(), starTrekCharacters[2 * start + 1].c_str()) < 0)
{
largest = 2 * start + 1;
}
if (2 * start + 2 < count && strcmp(starTrekCharacters[largest].c_str(), starTrekCharacters[2 * start + 2].c_str()) < 0)
{
largest = 2 * start + 2;
}
if (strcmp(starTrekCharacters[start].c_str(), starTrekCharacters[largest].c_str()) < 0)
{
swap(starTrekCharacters[start], starTrekCharacters[largest]);
start = largest;
}
else
break;
}
}
void makeHeap(string *starTrekCharacters, int count)
{
int i;
for (i = count / 2; i >= 0; --i)
moveDown(starTrekCharacters, i, count);
}
void heapSort(string starTrekCharacters[], int numberOfItems)
{
makeHeap(starTrekCharacters, numberOfItems);
//swap the root(maximum value) of the heap with the last element of the heap
//decrease the size of the heap by one so that the previous max value will
//stay in its proper placement
while (numberOfItems != 1)
{
swap(starTrekCharacters[0], starTrekCharacters[numberOfItems - 1]);
--numberOfItems;
moveDown(starTrekCharacters, 0, numberOfItems);//put the heap back in max-heap order
}
return;
}
void printItems(string characters[], int numberOfItems)
{
for (int i=0; i < numberOfItems; i++)
{
cout << characters[i] << endl;
}
cout << endl;
return;
}
int main(int argc, char **argv)
{
string starTrekCharacters[] = {
"Picard", "Riker", "Data", "La Forge", "Worf", "Dr. Crusher",
"Dr. Pulaski", "Wesley", "Troi", "Tasha", "Sisko", "Odo",
"Dax", "O'Brien", "Quark", "Dr. Bashier", "Kira", "B'Elanna",
"Chakotay", "Janeway", "Neelix", "Seven of Nine", "Tuvok",
"Doctor", "Harry", "Tom", "Kes", "Archer", "T'Pol", "Tucker",
"Reed", "Travis", "Hoshi", "Dr. Phlox", "Kirk", "Spock",
"Bones", "Scotty", "Chekov", "Uhura", "Sulu", "Nurse Chapel"
};
int numberOfCharacters = GetArrLength(starTrekCharacters);
// Print the unsorted items
cout << "Items unsorted:" << endl;
printItems(starTrekCharacters, numberOfCharacters);
// Sort the items
heapSort(starTrekCharacters, numberOfCharacters);
// Print the sorted items
cout << "Items sorted:" << endl;
printItems(starTrekCharacters, numberOfCharacters);
system("PAUSE");
return 0;
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.