dlasrt function

void dlasrt(
  1. String ID,
  2. int N,
  3. Array<double> D_,
  4. Box<int> INFO,
)

Implementation

void dlasrt(
  final String ID,
  final int N,
  final Array<double> D_,
  final Box<int> INFO,
) {
  final D = D_.having();
  const SELECT = 20;
  int DIR, ENDD, I, J, START, STKPNT;
  double D1, D2, D3, DMNMX, TMP;
  final STACK = Matrix<int>(2, 32);

  // Test the input parameters.

  INFO.value = 0;
  DIR = -1;
  if (lsame(ID, 'D')) {
    DIR = 0;
  } else if (lsame(ID, 'I')) {
    DIR = 1;
  }
  if (DIR == -1) {
    INFO.value = -1;
  } else if (N < 0) {
    INFO.value = -2;
  }
  if (INFO.value != 0) {
    xerbla('DLASRT', -INFO.value);
    return;
  }

  // Quick return if possible

  if (N <= 1) return;

  STKPNT = 1;
  STACK[1][1] = 1;
  STACK[2][1] = N;
  do {
    START = STACK[1][STKPNT];
    ENDD = STACK[2][STKPNT];
    STKPNT--;
    if (ENDD - START <= SELECT && ENDD - START > 0) {
      // Do Insertion sort on D[ START:ENDD ]

      if (DIR == 0) {
        // Sort into decreasing order

        for (I = START + 1; I <= ENDD; I++) {
          for (J = I; J >= START + 1; J--) {
            if (D[J] > D[J - 1]) {
              DMNMX = D[J];
              D[J] = D[J - 1];
              D[J - 1] = DMNMX;
            } else {
              break;
            }
          }
        }
      } else {
        // Sort into increasing order

        for (I = START + 1; I <= ENDD; I++) {
          for (J = I; J >= START + 1; J--) {
            if (D[J] < D[J - 1]) {
              DMNMX = D[J];
              D[J] = D[J - 1];
              D[J - 1] = DMNMX;
            } else {
              break;
            }
          }
        }
      }
    } else if (ENDD - START > SELECT) {
      // Partition D[ START:ENDD ] and stack parts, largest one first

      // Choose partition entry as median of 3

      D1 = D[START];
      D2 = D[ENDD];
      I = (START + ENDD) ~/ 2;
      D3 = D[I];
      if (D1 < D2) {
        if (D3 < D1) {
          DMNMX = D1;
        } else if (D3 < D2) {
          DMNMX = D3;
        } else {
          DMNMX = D2;
        }
      } else {
        if (D3 < D2) {
          DMNMX = D2;
        } else if (D3 < D1) {
          DMNMX = D3;
        } else {
          DMNMX = D1;
        }
      }

      if (DIR == 0) {
        // Sort into decreasing order

        I = START - 1;
        J = ENDD + 1;
        while (true) {
          do {
            J--;
          } while (D[J] < DMNMX);
          do {
            I++;
          } while (D[I] > DMNMX);
          if (I < J) {
            TMP = D[I];
            D[I] = D[J];
            D[J] = TMP;
            continue;
          }
          break;
        }
        if (J - START > ENDD - J - 1) {
          STKPNT++;
          STACK[1][STKPNT] = START;
          STACK[2][STKPNT] = J;
          STKPNT++;
          STACK[1][STKPNT] = J + 1;
          STACK[2][STKPNT] = ENDD;
        } else {
          STKPNT++;
          STACK[1][STKPNT] = J + 1;
          STACK[2][STKPNT] = ENDD;
          STKPNT++;
          STACK[1][STKPNT] = START;
          STACK[2][STKPNT] = J;
        }
      } else {
        // Sort into increasing order

        I = START - 1;
        J = ENDD + 1;
        while (true) {
          do {
            J--;
          } while (D[J] > DMNMX);
          do {
            I++;
          } while (D[I] < DMNMX);
          if (I < J) {
            TMP = D[I];
            D[I] = D[J];
            D[J] = TMP;
            continue;
          }
          break;
        }
        if (J - START > ENDD - J - 1) {
          STKPNT++;
          STACK[1][STKPNT] = START;
          STACK[2][STKPNT] = J;
          STKPNT++;
          STACK[1][STKPNT] = J + 1;
          STACK[2][STKPNT] = ENDD;
        } else {
          STKPNT++;
          STACK[1][STKPNT] = J + 1;
          STACK[2][STKPNT] = ENDD;
          STKPNT++;
          STACK[1][STKPNT] = START;
          STACK[2][STKPNT] = J;
        }
      }
    }
  } while (STKPNT > 0);
}