001: #include <iostream>
002: #include <vector>
003: #include <cstdlib>
004: #include <ctime>
006: using namespace std;
008: /** 
009:    Merges two adjacent ranges in a vector
010:    @param a the vector with the elements to merge
011:    @param from the start of the first range
012:    @param mid the end of the first range
013:    @param to the end of the second range
014: */
015: void merge(vector<int>& a, int from, int mid, int to)
016: {  int n = to - from + 1; /* size of the range to be merged */
018:    /* merge both halves into a temporary vector b */
019:    vector<int> b(n);
020: 
021:    int i1 = from;
022:       /* next element to consider in the first half */
023:    int i2 = mid + 1;
024:       /* next element to consider in the second half */
025:    int j = 0; /* next open position in b */
027:    /* 
028:       As long as neither i1 nor i2 past the end, move the smaller
029:       element into b
030:    */
031:    while (i1 <= mid && i2 <= to)
032:    {  if (a[i1] < a[i2])
034:       {  b[j] = a[i1];
036:          i1++;
037:       }
038:       else
039:       {  b[j] = a[i2];
041:          i2++;
042:       }
043:       j++;
044:    }
046:    /* 
047:       Note that only one of the two while loops below is executed
048:    */
050:    /* Copy any remaining entries of the first half */
051:    while (i1 <= mid)
052:    {  b[j] = a[i1];
054:       i1++;
055:       j++;
056:    }
057:    /* Copy any remaining entries of the second half */
058:    while (i2 <= to)
059:    {  b[j] = a[i2];
061:       i2++;
062:       j++;
063:    }
065:    /* Copy back from the temporary vector */
066:    for (j = 0; j < n; j++) a[from + j] = b[j];
068: }
070: /**  
071:    Sorts the elements in a range of a vector.
072:    @param a the vector with the elements to sort
073:    @param from start of the range to sort
074:    @param to end of the range to sort
075: */
076: void merge_sort(vector<int>& a, int from, int to)
077: {  if (from == to) return;
079:    int mid = (from + to) / 2;
080:    /* sort the first and the second half */
081:    merge_sort(a, from, mid);
082:    merge_sort(a, mid + 1, to);
083:    merge(a, from, mid, to);
084: }
086: /** 
087:    Prints all elements in a vector
088:    @param a the vector to print
089: */
090: void print(vector<int> a)
091: {  for (int i = 0; i < a.size(); i++) cout << a[i] << " ";
094:    cout << "\n";
095: }
097: /**
098:    Sets the seed of the random number generator.
099: */
100: void rand_seed()
101: {  int seed = static_cast<int>(time(0));
103:    srand(seed);
104: }
106: /** 
107:    Computes a random integer in a range.
108:    @param a the bottom of the range
109:    @param b the top of the range
110:    @return a random integer x, a <= x and x <= b
111: */
112: int rand_int(int a, int b)
113: {  return a + rand() % (b - a + 1);  }
116: 
117: int main()
118: {  rand_seed();
120:    vector<int> v(20);
121:    for (int i = 0; i < v.size(); i++)
122:       v[i] = rand_int(1, 100);
123:    print(v);
124:    merge_sort(v, 0, v.size() - 1);
125:    print(v);
126:    return 0;
127: }