|
//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 */ |