#include<iostream>
#include<cstdlib>
#include<math.h>
using namespace std;
void MergeSort(int** , int, int);
void Merge(int**, int, int, int);
void duplicate_array(int**, int**, int, int);
void printout_array(int**,int,int);
void ins_sort(int**, int, int);
int main(){
int n, a_min, a_max, rseed;
cout << "Please input [n, a_min, a_max. rseed]" << endl ;
cin >> n >> a_min >> a_max >> rseed;
int** forI = new int*[1];// Building Dynamic array
int** forM = new int*[1];
for (int i = 1 ; i <= 1 ; i++){
forI[i] = new int [n];
forM[i] = new int [n];
}
srand(rseed); //initial randomly variable
cout << "Randomly sequence :" << endl;
for(int i = 1; i <= n; i++){ //randomly variable between a_min & a_max
int x = rand()%(a_max-a_min+1) + a_min;
forI[1][i] = x;
}
cout << forI[1][10] << endl;
printout_array(forI, 1, n);
duplicate_array(forI, forM, 1, n); //copy to another array that for merge sort
cout << endl << "By insertion sort" << endl ;
ins_sort(forI, 1, n);
printout_array(forI, 1, n);
cout << endl << "By merge sort" << endl ;
MergeSort(forM, 1, n);
printout_array(forM, 1, n);
for(int i = 0; i <= n; i++){ // delete pointer array
delete []forI[i];
delete []forM[i];
}
delete []forI;
delete []forM;
return 0;
}
void ins_sort(int**a, int raw, int col){ //raw = 1
int i, j, key, rec;
for(i = 1; i <= raw; i++){ //key is additional place
for(j = 2; j <= col; j++)
{
key = a[i][j];
rec = j; // record position of j
while (a[i][rec-1] < key && rec > 1 ) //the value of the left of the space is bigger than key
{
a[i][rec] = a[i][rec-1]; //move to left space
rec--;
}
a[i][rec] = key; //the last space equal to key
}
}
}
void MergeSort(int **a, int low, int high)
{
int mid;
if (low < high)
{
mid = (low + high) / 2;
// divide into two blocks
MergeSort(a, low, mid);
MergeSort(a, mid+1, high);
//make a recursion
// start to mergec
Merge(a, low, high, mid);
}
}
void Merge(int **a, int low, int high, int mid){
// low -> middle & middle -> high have been sorted
int i, j, k;
int ram[high - low + 1];
i = low;
k = 0;
j = mid + 1;
// merge into ram[]
while (i <= mid && j <= high){
if (a[1][i] > a[1][j]){
ram[k] = a[1][i];
k++;
i++;
}
else{
ram[k] = a[1][j];
k++;
j++;
}
}
// insert remaining function
while (i <= mid){
ram[k] = a[1][i];
k++;
i++;
}
while (j <= high){
ram[k] = a[1][j];
k++;
j++;
}
// copy data from ram[] to a[][]
for (i = low; i <= high; i++){
a[1][i] = ram[i-low];
}
}
void printout_array(int**A, int b, int c){//printout every single element of A[][]
for(int i = 1; i <= b; i++){
for(int j = 1; j <= c; j++){
cout << A[i][j] << " ";
}
}
}
void duplicate_array(int**O, int**C,int m,int n){ //copy array
for(int i = 1; i <= m; i++)
{
for(int j = 0; j <= n; j++)
{
C[i][j] = O[i][j];
}
}
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGNzdGRsaWI+CiNpbmNsdWRlPG1hdGguaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgTWVyZ2VTb3J0KGludCoqICwgaW50LCBpbnQpOwp2b2lkIE1lcmdlKGludCoqLCBpbnQsIGludCwgaW50KTsKdm9pZCBkdXBsaWNhdGVfYXJyYXkoaW50KiosIGludCoqLCBpbnQsIGludCk7CnZvaWQgcHJpbnRvdXRfYXJyYXkoaW50KiosaW50LGludCk7CnZvaWQgaW5zX3NvcnQoaW50KiosIGludCwgaW50KTsKaW50IG1haW4oKXsKCmludCBuLCBhX21pbiwgYV9tYXgsIHJzZWVkOwoKY291dCA8PCAiUGxlYXNlIGlucHV0IFtuLCBhX21pbiwgYV9tYXguIHJzZWVkXSIgPDwgZW5kbCA7CmNpbiA+PiBuID4+IGFfbWluID4+IGFfbWF4ID4+IHJzZWVkOwoKaW50KiogZm9ySSA9IG5ldyBpbnQqWzFdOy8vIEJ1aWxkaW5nIER5bmFtaWMgYXJyYXkKaW50KiogZm9yTSA9IG5ldyBpbnQqWzFdOwpmb3IgKGludCBpID0gMSA7IGkgPD0gMSA7IGkrKyl7CiAgICBmb3JJW2ldID0gbmV3IGludCBbbl07CiAgICBmb3JNW2ldID0gbmV3IGludCBbbl07Cn0KCgpzcmFuZChyc2VlZCk7IC8vaW5pdGlhbCByYW5kb21seSB2YXJpYWJsZQpjb3V0IDw8ICJSYW5kb21seSBzZXF1ZW5jZSA6IiA8PCBlbmRsOwpmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKyl7ICAgICAgICAgICAgICAgICAvL3JhbmRvbWx5IHZhcmlhYmxlIGJldHdlZW4gYV9taW4gJiBhX21heAogICAgaW50IHggPSByYW5kKCklKGFfbWF4LWFfbWluKzEpICsgYV9taW47CiAgICBmb3JJWzFdW2ldID0geDsKfQpjb3V0IDw8IGZvcklbMV1bMTBdIDw8IGVuZGw7CnByaW50b3V0X2FycmF5KGZvckksIDEsIG4pOwpkdXBsaWNhdGVfYXJyYXkoZm9ySSwgZm9yTSwgMSwgbik7IC8vY29weSB0byBhbm90aGVyIGFycmF5IHRoYXQgZm9yIG1lcmdlIHNvcnQKCmNvdXQgPDwgZW5kbCA8PCAiQnkgaW5zZXJ0aW9uIHNvcnQiIDw8IGVuZGwgOwppbnNfc29ydChmb3JJLCAxLCBuKTsKcHJpbnRvdXRfYXJyYXkoZm9ySSwgMSwgbik7Cgpjb3V0IDw8IGVuZGwgPDwgIkJ5IG1lcmdlIHNvcnQiIDw8IGVuZGwgOwoKTWVyZ2VTb3J0KGZvck0sIDEsIG4pOwpwcmludG91dF9hcnJheShmb3JNLCAxLCBuKTsKCmZvcihpbnQgaSA9IDA7IGkgPD0gbjsgaSsrKXsgLy8gZGVsZXRlIHBvaW50ZXIgYXJyYXkKICAgIGRlbGV0ZSBbXWZvcklbaV07CiAgICBkZWxldGUgW11mb3JNW2ldOwp9CmRlbGV0ZSBbXWZvckk7CmRlbGV0ZSBbXWZvck07CgpyZXR1cm4gMDsKfQoKdm9pZCBpbnNfc29ydChpbnQqKmEsIGludCByYXcsIGludCBjb2wpeyAvL3JhdyA9IDEKICAgIGludCBpLCBqLCBrZXksIHJlYzsKICAgIGZvcihpID0gMTsgaSA8PSByYXc7IGkrKyl7ICAgICAgICAgLy9rZXkgaXMgYWRkaXRpb25hbCBwbGFjZQogICAgICAgIGZvcihqID0gMjsgaiA8PSBjb2w7IGorKykKICAgICAgICB7CiAgICAgICAgICAgIGtleSA9IGFbaV1bal07CiAgICAgICAgICAgIHJlYyA9IGo7ICAgICAgICAgICAgICAgICAgIC8vIHJlY29yZCBwb3NpdGlvbiBvZiBqCiAgICAgICAgICAgIHdoaWxlIChhW2ldW3JlYy0xXSA8IGtleSAmJiByZWMgPiAxICkgLy90aGUgdmFsdWUgb2YgdGhlIGxlZnQgb2YgdGhlIHNwYWNlIGlzIGJpZ2dlciB0aGFuIGtleQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhW2ldW3JlY10gPSBhW2ldW3JlYy0xXTsgICAgICAgICAgLy9tb3ZlIHRvIGxlZnQgc3BhY2UKICAgICAgICAgICAgICAgIHJlYy0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFbaV1bcmVjXSA9IGtleTsgICAgICAgICAgICAgICAgICAgICAvL3RoZSBsYXN0IHNwYWNlIGVxdWFsIHRvIGtleQogICAgICAgIH0KICAgIH0KfQoKdm9pZCBNZXJnZVNvcnQoaW50ICoqYSwgaW50IGxvdywgaW50IGhpZ2gpCnsKCWludCBtaWQ7CglpZiAobG93IDwgaGlnaCkKCXsKCQltaWQgPSAobG93ICsgaGlnaCkgLyAyOwoJCS8vIGRpdmlkZSBpbnRvIHR3byBibG9ja3MKCQlNZXJnZVNvcnQoYSwgbG93LCBtaWQpOwoJCU1lcmdlU29ydChhLCBtaWQrMSwgaGlnaCk7CiAgICAgICAgLy9tYWtlIGEgcmVjdXJzaW9uCgkJLy8gc3RhcnQgdG8gbWVyZ2VjCgkJTWVyZ2UoYSwgbG93LCBoaWdoLCBtaWQpOwoJfQp9Cgp2b2lkIE1lcmdlKGludCAqKmEsIGludCBsb3csIGludCBoaWdoLCBpbnQgbWlkKXsKCS8vIGxvdyAtPiBtaWRkbGUgJiBtaWRkbGUgLT4gaGlnaCBoYXZlIGJlZW4gc29ydGVkCglpbnQgaSwgaiwgazsKCWludCAgcmFtW2hpZ2ggLSBsb3cgKyAxXTsKCWkgPSBsb3c7CglrID0gMDsKCWogPSBtaWQgKyAxOwoKCS8vIG1lcmdlIGludG8gcmFtW10KCXdoaWxlIChpIDw9IG1pZCAmJiBqIDw9IGhpZ2gpeyAgIAoJCWlmIChhWzFdW2ldID4gYVsxXVtqXSl7CgkJCXJhbVtrXSA9IGFbMV1baV07CgkJCWsrKzsKCQkJaSsrOwoJCX0KCQllbHNlewoJCQlyYW1ba10gPSBhWzFdW2pdOwoJCQlrKys7CgkJCWorKzsKCQl9CgoJfQoJLy8gaW5zZXJ0IHJlbWFpbmluZyBmdW5jdGlvbgoJd2hpbGUgKGkgPD0gbWlkKXsKCQlyYW1ba10gPSBhWzFdW2ldOwoJCWsrKzsKCQlpKys7Cgl9Cgl3aGlsZSAoaiA8PSBoaWdoKXsKCQlyYW1ba10gPSBhWzFdW2pdOwoJCWsrKzsKCQlqKys7Cgl9CgkvLyBjb3B5IGRhdGEgZnJvbSByYW1bXSB0byBhW11bXQoJZm9yIChpID0gbG93OyBpIDw9IGhpZ2g7IGkrKyl7CgkJYVsxXVtpXSA9IHJhbVtpLWxvd107Cgl9Cn0KCgp2b2lkIHByaW50b3V0X2FycmF5KGludCoqQSwgaW50IGIsIGludCBjKXsvL3ByaW50b3V0IGV2ZXJ5IHNpbmdsZSBlbGVtZW50IG9mIEFbXVtdCiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IGI7IGkrKyl7CiAgICAgICAgZm9yKGludCBqID0gMTsgaiA8PSBjOyBqKyspewogICAgICAgICAgICBjb3V0IDw8IEFbaV1bal0gPDwgIiAgIjsKICAgICAgICB9CiAgICB9Cn0KCnZvaWQgZHVwbGljYXRlX2FycmF5KGludCoqTywgaW50KipDLGludCBtLGludCBuKXsgLy9jb3B5IGFycmF5CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG07IGkrKykKICAgIHsKICAgICAgICBmb3IoaW50IGogPSAwOyBqIDw9IG47IGorKykKICAgICAgICB7CiAgICAgICAgICAgIENbaV1bal0gPSBPW2ldW2pdOwogICAgICAgIH0KICAgIH0KCn0K