//sortedList07.cpp
//date: 09/23/2002
//author: AOU
////////////////////////////////////////////////////////////
// Include files
////////////////////////////////////////////////////////////
#include<iostream.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
////////////////////////////////////////////////////////////
// Constants
////////////////////////////////////////////////////////////
const int ARRAY_SIZE = 20;
const int UNDEFINED = -9999;
const int MAX_VALUE = 10;
////////////////////////////////////////////////////////////
// Test function prototypes
////////////////////////////////////////////////////////////
void testSortBubble2(void);
void testSearchSeq(void);
void testSearchBinary(void);
////////////////////////////////////////////////////////////
// Class CSortedList
////////////////////////////////////////////////////////////
class CSortedList
{
private:
int m_array[ARRAY_SIZE];
int m_count;
int m_min;
int m_max;
void sortBubble1(void);
public:
CSortedList(void);
CSortedList(char ch);
void display(void);
bool insert(int x);
bool isSorted(void);
void sortBubble2(void);
void shuffle(void);
int searchSeq(int x);
int searchBinary(int x); //2002.09.23
};
////////////////////////////////////////////////////////////
// main function
////////////////////////////////////////////////////////////
void main(void)
{
srand(time(NULL));
//testSortBubble2();
//testSearchSeq();
testSearchBinary();
}
////////////////////////////////////////////////////////////
// searchBinary(x)
////////////////////////////////////////////////////////////
/*
Given sorted array[0..count-1], x
[12, 23, 27, 29, 32], 27 => 2
[12, 23, 27, 29, 32], 24 => -1
Algorithm0:
while there is a list to be searched
calculate mid point of the list to be searched
if x = array[mid] then return mid
find out which half of the list to be searched
end while
Algorithm1:
*/
int CSortedList::searchBinary(int x)
{
int lower, upper, mid;
lower = 0;
upper = this->m_count-1;
while (lower <= upper)
{
mid = (lower+upper)/2;
if (x == this->m_array[mid])
return mid;
if (x < this->m_array[mid])
upper = mid-1;
if (x > this->m_array[mid])
lower = mid+1;
}
return -1;
}
void testSearchBinary(void)
{
for (int j=1; j<=5; j++)
{
CSortedList myList('r');
int x, p;
myList.display();
for (int i=0; i<10; i++)
{
x = rand()%(MAX_VALUE+1);
p = myList.searchBinary(x);
cout << x << " was found at position " << p << endl;
p = myList.searchSeq(x);
cout << x << " was found at position " << p << endl;
}
cout << "-----------------\n";
}
}
////////////////////////////////////////////////////////////
// searchSeq(x)
////////////////////////////////////////////////////////////
/*Given sorted array[0..count-1], x
[12, 23, 27, 29, 32], 27 => 2
[12, 23, 27, 29, 32], 24 => -1
Algorithm0:
search for x from left to right in array[]
if found return the position
return -1
Algorithm1:
for i=0 to count-1 do the following
if x = array[i] then return i
end for
return -1
Algorithm2:
for i=0 to count-1 do the following
if x = array[i] then return i
if x < array[i] then exit for loop
end for
return -1
*/
int CSortedList::searchSeq(int x)
{
for (int i=0; i<=this->m_count-1; i++)
{
if (x == m_array[i])
return i;
if (x < this->m_array[i])
break;
}
return -1;
}
void testSearchSeq(void)
{
for (int j=1; j<=5; j++)
{
CSortedList myList('r');
int x, p;
myList.display();
for (int i=0; i<10; i++)
{
x = rand()%(MAX_VALUE+1);
p = myList.searchSeq(x);
cout << x << " was found at position " << p << endl;
}
cout << "-----------------\n";
}
}
////////////////////////////////////////////////////////////
// CSortedList(void)
////////////////////////////////////////////////////////////
CSortedList::CSortedList(void)
{
this->m_count = 0;
this->m_min = UNDEFINED;
this->m_max = UNDEFINED;
}
////////////////////////////////////////////////////////////
// CSortedList(char ch)
////////////////////////////////////////////////////////////
CSortedList::CSortedList(char ch)
{
this->m_count = 0;
int x, n;
if ('r' == ch)
{
n = rand()%(ARRAY_SIZE+1);
for (int i=0; i<n; i++)
{
x = rand()%(MAX_VALUE+1);
this->insert(x);// or (*this).insert();
}
}
}
////////////////////////////////////////////////////////////
// display(void)
////////////////////////////////////////////////////////////
void CSortedList::display(void)
{
cout << "SortedList(" << this->m_count << ")= ";
for (int i=0; i<this->m_count; i++)
cout << this->m_array[i] << ' ';
cout << endl;
}
////////////////////////////////////////////////////////////
// insert(int x)
////////////////////////////////////////////////////////////
bool CSortedList::insert(int x)
{
//allow duplicate values
/*
there is no room then return false
there is room then add to the end, sort, return true
*/
if (ARRAY_SIZE == this->m_count)
return false;
else
{
this->m_array[m_count] = x;
this->m_count++;
this->sortBubble1();
return true;
}
}
////////////////////////////////////////////////////////////
// sortBubble1(void)
////////////////////////////////////////////////////////////
void CSortedList::sortBubble1(void)
{
int j;
for (int i=1; i<=this->m_count-1; i++)
{
for (j=0; j<=this->m_count-2; j++)
{
if (this->m_array[j] > this->m_array[j+1])
{
int temp = this->m_array[j];
this->m_array[j] = this->m_array[j+1];
this->m_array[j+1] = temp;
}
}
}
}
////////////////////////////////////////////////////////////
// sortBubble2(void)
////////////////////////////////////////////////////////////
/*
Algorithm0:
do
swaps =0
make one pass trying to put items in order
until swaps == 0
Algorithm1:
sorted = false
while not sorted
sorted = true
make one pass trying to put items in order
end while
Algorithm2:
sorted = false
while not sorted
sorted = true
for i= 0 to m_count-2 do the following
if m_array[i] > m_array[i+1] then
swap m_array[i], m_array[i+1]
sorted = false
end if
end for
end while
*/
void CSortedList::sortBubble2(void)
{
}
////////////////////////////////////////////////////////////
// testSortBubble2(void)
////////////////////////////////////////////////////////////
void testSortBubble2(void)
{
for (int i=1; i<=10; i++)
{
CSortedList myList('r');
cout << "Original list\n";
myList.display();
if (myList.isSorted())
cout << " List is SORTED\n";
else
cout << " List is NOT SORTED\n";
myList.shuffle();
cout << "Shuffled list\n";
myList.display();
if (myList.isSorted())
cout << " List is SORTED\n";
else
cout << " List is NOT SORTED\n";
myList.sortBubble2();
cout << "After sortBubble2\n";
myList.display();
if (myList.isSorted())
cout << " List is SORTED\n";
else
cout << " List is NOT SORTED\n";
cout << "-------------------\n";
}
}
////////////////////////////////////////////////////////////
// isSorted(void)
////////////////////////////////////////////////////////////
bool CSortedList::isSorted(void)
{
return true;
}
////////////////////////////////////////////////////////////
// shuffle(void)
////////////////////////////////////////////////////////////
void CSortedList::shuffle(void)
{
int picked, temp;
for (int i=0; i<=this->m_count-1; i++)
{
picked = rand()%this->m_count;
temp = this->m_array[0];
this->m_array[0] = this->m_array[picked];
this->m_array[picked] = temp;
}
}
/*
SAMPLE RUN:
SortedList(19)= 0 0 3 3 3 4 4 5 6 6 6 8 8 8 9 9 10 10 10
5 was found at position 7
5 was found at position 7
3 was found at position 4
3 was found at position 2
8 was found at position 11
8 was found at position 11
9 was found at position 14
9 was found at position 14
1 was found at position -1
1 was found at position -1
2 was found at position -1
2 was found at position -1
5 was found at position 7
5 was found at position 7
5 was found at position 7
5 was found at position 7
2 was found at position -1
2 was found at position -1
5 was found at position 7
5 was found at position 7
-----------------
SortedList(1)= 7
7 was found at position 0
7 was found at position 0
2 was found at position -1
2 was found at position -1
10 was found at position -1
10 was found at position -1
2 was found at position -1
2 was found at position -1
5 was found at position -1
5 was found at position -1
0 was found at position -1
0 was found at position -1
5 was found at position -1
5 was found at position -1
5 was found at position -1
5 was found at position -1
8 was found at position -1
8 was found at position -1
4 was found at position -1
4 was found at position -1
-----------------
SortedList(18)= 0 1 1 2 2 3 3 4 6 6 6 6 6 7 8 8 10 10
8 was found at position 15
8 was found at position 14
3 was found at position 5
3 was found at position 5
1 was found at position 1
1 was found at position 1
2 was found at position 3
2 was found at position 3
5 was found at position -1
5 was found at position -1
7 was found at position 13
7 was found at position 13
6 was found at position 8
6 was found at position 8
10 was found at position 16
10 was found at position 16
9 was found at position -1
9 was found at position -1
10 was found at position 16
10 was found at position 16
-----------------
SortedList(6)= 1 2 2 5 5 8
9 was found at position -1
9 was found at position -1
10 was found at position -1
10 was found at position -1
6 was found at position -1
6 was found at position -1
2 was found at position 2
2 was found at position 1
2 was found at position 2
2 was found at position 1
9 was found at position -1
9 was found at position -1
10 was found at position -1
10 was found at position -1
9 was found at position -1
9 was found at position -1
1 was found at position 0
1 was found at position 0
3 was found at position -1
3 was found at position -1
-----------------
SortedList(11)= 0 1 3 4 5 6 6 6 6 7 8
10 was found at position -1
10 was found at position -1
0 was found at position 0
0 was found at position 0
10 was found at position -1
10 was found at position -1
9 was found at position -1
9 was found at position -1
1 was found at position 1
1 was found at position 1
5 was found at position 4
5 was found at position 4
7 was found at position 9
7 was found at position 9
10 was found at position -1
10 was found at position -1
5 was found at position 4
5 was found at position 4
4 was found at position 3
4 was found at position 3
-----------------
Press any key to continue
*/
|