Problem p02262 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include <algorithm>
#include <array>
#include <cmath>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

//???????????°??????TEST????????????????????¬???????????????????????????????????¢????????????
// #define TEST
// //*******************************************************************************************************************************************

//?????????????????¨??§?????\\????????????????????????????????°?????????????¨???????????????????dout???????????????????????§???????????¬??????????????????????????????????????????
// #ifdef TEST
//    #define dout cout
// #else
//    stringstream dummy;
//    //???????????°??????dout????????????????????????????????? #define dout
//    dummy
// #endif

//?????????????????´??°????´???°?????????????????????
bool isPrime(int x) {
  if (x <= 1)
    return false;
  if (x == 2)
    return true;
  if (x % 2 == 0)
    return false;

  for (int i = 3; i <= sqrt(x); i += 2) {
    if (x % i == 0)
      return false;
  }
  return true;
}

//?????\\????????????gap?????????
int insertionSort(int a[], int numOfData, int gap) {
  int cnt = 0; //??????????????°??????????????¨

  for (int i = gap; i < numOfData; i++) {

    //        //display a[]
    //        for(int k=0; k<numOfData; k++) {
    //            if(k==i) dout << "|";
    //            if(k==0) dout << a[k];
    //            else dout << " " << a[k];
    //
    //        }
    //        dout << endl;

    // sort procedure
    int key = a[i];

    int j;
    for (j = i - gap; j >= 0 && a[j] > key; j -= gap) {
      a[j + gap] = a[j];
      cnt++;
    } // end of j-loop

    a[j + gap] = key;

  } // end of i-loop

  return cnt;
}

int main(void) {
  int numOfData;
  cin >> numOfData;

  // input data
  int a[numOfData];
  for (int i = 0; i < numOfData; i++) {
    cin >> a[i];
  }

  //    dout << "<Before>\\n";
  //    //display a[]
  //    for(int i=0; i<numOfData; i++) {
  //        if(i==0) dout << a[i];
  //        else dout << " " << a[i];
  //    }
  //    dout << endl;

  //    //calc. gap[]
  //    //numOfData????¶???????????´???°????????§?????£?????????
  //    vector<int> gap;
  //    gap.push_back(1);
  //    for(int i=2; i<numOfData; i++) {
  //        if( isPrime(i) ) {
  //            gap.push_back(i);
  //        }
  //    }
  //    reverse(gap.begin(), gap.end()); //?????????????????????

  // calc. gap[]
  //?´???°??§??????????????£????????§???Wikipedia????????????3n+1?????°?????§??????
  vector<int> gap;
  gap.push_back(1);
  int i = 1;
  while ((i = 3 * i + 1) < numOfData) {
    gap.push_back(i);
  }
  reverse(gap.begin(), gap.end()); //?????????????????????

  // display gap[]
  //    dout << "g.size = ";
  cout << gap.size() << endl;
  //    dout << "g[] = ";
  for (int i = 0; i < gap.size(); i++) {
    if (i == 0)
      cout << gap[i];
    else
      cout << " " << gap[i];
  }
  cout << endl;

  //    dout << "Shell Sort\\n";
  int computationalComplexity = 0;
  for (int i = 0; i < gap.size(); i++) {
    //        dout << "gap[" << i << "] = " << gap[i] << endl;
    computationalComplexity += insertionSort(&a[0], numOfData, gap[i]);
    //        dout << "?¨??????? = " << computationalComplexity << endl;
  }

  //?¨????????????????
  //    dout << "Max??¶?????? n^1.5 = " << pow(numOfData, 1.5) << " / ";
  //    dout << "??????????¨??????? = ";
  cout << computationalComplexity << endl;

  //    dout << "<After>\\n";
  // display a[]
  for (int i = 0; i < numOfData; i++) {
    cout << a[i] << endl;
  }

  return 0;
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <array>
#include <cmath>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

//???????????°??????TEST????????????????????¬???????????????????????????????????¢????????????
// #define TEST
// //*******************************************************************************************************************************************

//?????????????????¨??§?????\\????????????????????????????????°?????????????¨???????????????????dout???????????????????????§???????????¬??????????????????????????????????????????
#ifdef TEST
#define dout cout
#else
stringstream dummy; //???????????°??????dout?????????????????????????????????
#define dout dummy
#endif

//?????????????????´??°????´???°?????????????????????
bool isPrime(int x) {
  if (x <= 1)
    return false;
  if (x == 2)
    return true;
  if (x % 2 == 0)
    return false;

  for (int i = 3; i <= sqrt(x); i += 2) {
    if (x % i == 0)
      return false;
  }
  return true;
}

//?????\\????????????gap?????????
int insertionSort(int a[], int numOfData, int gap) {
  int cnt = 0; //??????????????°??????????????¨

  for (int i = gap; i < numOfData; i++) {

    // display a[]
    for (int k = 0; k < numOfData; k++) {
      if (k == i)
        dout << "|";
      if (k == 0)
        dout << a[k];
      else
        dout << " " << a[k];
    }
    dout << endl;

    // sort procedure
    int key = a[i];

    int j;
    for (j = i - gap; j >= 0 && a[j] > key; j -= gap) {
      a[j + gap] = a[j];
      cnt++;
    } // end of j-loop

    a[j + gap] = key;

  } // end of i-loop

  return cnt;
}

int main(void) {
  int numOfData;
  cin >> numOfData;

  // input data
  int a[numOfData];
  for (int i = 0; i < numOfData; i++) {
    cin >> a[i];
  }

  dout << "<Before>\\n";
  // display a[]
  for (int i = 0; i < numOfData; i++) {
    if (i == 0)
      dout << a[i];
    else
      dout << " " << a[i];
  }
  dout << endl;

  //    //calc. gap[]
  //    //numOfData????¶???????????´???°????????§?????£?????????
  //    vector<int> gap;
  //    gap.push_back(1);
  //    for(int i=2; i<numOfData; i++) {
  //        if( isPrime(i) ) {
  //            gap.push_back(i);
  //        }
  //    }
  //    reverse(gap.begin(), gap.end()); //?????????????????????

  // calc. gap[]
  //?´???°??§??????????????£????????§???Wikipedia????????????3n+1?????°?????§??????
  vector<int> gap;
  gap.push_back(1);
  int i = 1;
  while ((i = 3 * i + 1) < numOfData) {
    gap.push_back(i);
  }
  reverse(gap.begin(), gap.end()); //?????????????????????

  // display gap[]
  dout << "g.size = ";
  cout << gap.size() << endl;
  dout << "g[] = ";
  for (int i = 0; i < gap.size(); i++) {
    if (i == 0)
      cout << gap[i];
    else
      cout << " " << gap[i];
  }
  cout << endl;

  dout << "Shell Sort\\n";
  int computationalComplexity = 0;
  for (int i = 0; i < gap.size(); i++) {
    dout << "gap[" << i << "] = " << gap[i] << endl;
    computationalComplexity += insertionSort(a, numOfData, gap[i]);
    dout << "?¨??????? = " << computationalComplexity << endl;
  }

  //?¨????????????????
  dout << "Max??¶?????? n^1.5 = " << pow(numOfData, 1.5) << " / ";
  dout << "??????????¨??????? = ";
  cout << computationalComplexity << endl;

  dout << "<After>\\n";
  // display a[]
  for (int i = 0; i < numOfData; i++) {
    cout << a[i] << endl;
  }

  return 0;
}