I have been trying to figure out this thing in the past hours but with no success.
I have several classes which I am using to add data, and so I can display them, but now i have to implement a MergeSort algorithem to sort this datas depending on the titles.
I have the Object CD, which all other classes inherits from, and object CD has the property title, type char.
Now when i pass the pointer to my class I do the comparision and checking, but it's not working how it should:
This is my Function for the Sorting Algorithm:
void merge(CD *a[], int, int, int);
void merge_sort(CD *a[], int low, int high) {
int mid;
if (low < high) {
mid = (low + high) / 2;
merge_sort(a, low, mid);
merge_sort(a,mid + 1, high);
merge(a, low, mid, high);
}
}
void merge(CD *a[], int low, int mid, int high) {
int h, i, j, k;
CD *b;
h = low;
i = low;
j = mid + 1;
while ((h <= mid) && (j <= high)) {
if (a[h]->title[100] <= a[j]->title[100]) {
b[i].title[100] = a[h]->title[100];
h++;
}
else {
b[i].title[100] = a[j]->title[100];
j++;
}
i++;
}
if (h > mid) {
for (k = j; k <= high; k++) {
b[i].title[100] = a[k]->title[100];
i++;
}
}
else {
for (k = h; k <= mid; k++) {
b[i].title[100] = a[k]->title[100];
i++;
}
}
for (k = low; k <= high; k++)
a[k]->title[100] = b[k].title[100];
}
Any idea how to implement something like this ?
There are several faults in the code you post on codepad, I'll point out in the program comments. Since you didn't give us the definitions of Popular
, Symphony
and Opera
, I'll have my own. For convenience, I put all the code in one file.
#pragma once
#include <string>
#include <iostream>
using namespace std;
class CD {
public:
string publisher, title, location, year, empty;
public:
CD()
{
publisher = "";
title = "";
location = "";
year = "";
empty = "";
}
void virtual input() = 0;
void virtual output() = 0;
};
class Popular : public CD
{
public:
Popular(const string& name)
{
title = name;
}
virtual void input()
{
return;
}
virtual void output()
{
return;
}
};
void merge(CD *a[], int, int, int);
void merge_sort(CD *a[], int low, int high) {
int mid;
if (low < high) {
mid = low + (high - low) / 2; //avoid overflow
merge_sort(a, low, mid);
merge_sort(a, mid + 1, high);
merge(a, low, mid, high);
}
}
void merge(CD *a[], int low, int mid, int high) {
int p1 = low;
int p2 = mid + 1;
CD ** merged = (CD**)malloc(sizeof(CD*) * (high - low + 1)); // CD *b[high] isn't illegal c++ syntax, VLA is part of C99.
int p = 0;
while(p1 < mid + 1 && p2 < high + 1)
{
if(a[p1]->title > a[p2]->title)
{
merged[p] = a[p2];
p2++;
}
else
{
merged[p] = a[p1];
p1++;
}
p++;
}
while(p1 < mid + 1)
{
merged[p++] = a[p1++];
}
while(p2 < high + 1)
merged[p++] = a[p2++];
for(int i = 0;i < (high - low + 1); i++)
{
a[low + i] = merged[i];
}
free(merged);
}
int main() {
CD *cdptr[100]; //pointer declaration for each of our class
int n = 0, choose;
// just to test the mergesort
CD* c1 = new Popular("hello");
CD* c2 = new Popular("world");
CD* c3 = new Popular("coldplay");
CD* c4 = new Popular("pink");
cdptr[n++] = c1;
cdptr[n++] = c2;
cdptr[n++] = c3;
cdptr[n++] = c4;
char terminate = 'n'; // you should initialize this variable.
do // do-while statement which allows the user to enter data and terminate the program when he wants
{
cout << "\n1.Classical";
cout << "\n2.Popular";
cout << "\n3.Sort";
cout << "\n4.Display";
cout << "\n5.Terminate program";
cout << endl << endl;
cout << "\nChoose category: ";
cin >> choose;
switch (choose) //switch for the user to choose the type of input
{
//skip the case 1, 2
case 3:
merge_sort(cdptr, 0, n - 1); // element indices begin at 0.
break;
case 4:
if (n == 0)
cout << "\nNo data entered!" << endl;
for (int i = 0; i < n; i++) {
cdptr[i]->output();
cout << endl;
}
break;
case 5:
cout << "\nDo you want to terminate the program? (y/n)";
cin >> terminate;
break;
default:
cout << "\nNot recognized value!" << endl;
}
} while (terminate != 'y');
for(int i = 0; i < 4; ++i)
cout<<cdptr[i]->title<<endl;
delete c1;
delete c2;
delete c3;
delete c4;
return 0;
}
Here's the output:
1.Classical
2.Popular
3.Sort
4.Display
5.Terminate program
Choose category: 3
1.Classical
2.Popular
3.Sort
4.Display
5.Terminate program
Choose category: 5
Do you want to terminate the program? (y/n)y
coldplay
hello
pink
world