// // Academic License - for use in teaching, academic research, and meeting // course requirements at degree granting institutions only. Not for // government, commercial, or other organizational use. // File: sort.cpp // // MATLAB Coder version : 5.3 // C/C++ source code generated on : 27-Mar-2023 15:34:32 // // Include Files #include "fun10_sort.h" #include "rt_nonfinite.h" #include "fun10_sortIdx.h" #include "coder_array.h" #include #include // Function Definitions // // Arguments : double x[16] // Return Type : void // namespace coder { namespace internal { void sort(double x[16]) { double xwork[16]; double x4[4]; int idx[16]; int iwork[16]; int i2; int i3; int ib; int k; signed char idx4[4]; signed char perm[4]; x4[0] = 0.0; idx4[0] = 0; x4[1] = 0.0; idx4[1] = 0; x4[2] = 0.0; idx4[2] = 0; x4[3] = 0.0; idx4[3] = 0; ib = 0; for (k = 0; k < 16; k++) { idx[k] = 0; xwork[k] = 0.0; ib++; idx4[ib - 1] = static_cast(k + 1); x4[ib - 1] = x[k]; if (ib == 4) { double d; double d1; int i4; if (x4[0] <= x4[1]) { ib = 1; i2 = 2; } else { ib = 2; i2 = 1; } if (x4[2] <= x4[3]) { i3 = 3; i4 = 4; } else { i3 = 4; i4 = 3; } d = x4[ib - 1]; d1 = x4[i3 - 1]; if (d <= d1) { d = x4[i2 - 1]; if (d <= d1) { perm[0] = static_cast(ib); perm[1] = static_cast(i2); perm[2] = static_cast(i3); perm[3] = static_cast(i4); } else if (d <= x4[i4 - 1]) { perm[0] = static_cast(ib); perm[1] = static_cast(i3); perm[2] = static_cast(i2); perm[3] = static_cast(i4); } else { perm[0] = static_cast(ib); perm[1] = static_cast(i3); perm[2] = static_cast(i4); perm[3] = static_cast(i2); } } else { d1 = x4[i4 - 1]; if (d <= d1) { if (x4[i2 - 1] <= d1) { perm[0] = static_cast(i3); perm[1] = static_cast(ib); perm[2] = static_cast(i2); perm[3] = static_cast(i4); } else { perm[0] = static_cast(i3); perm[1] = static_cast(ib); perm[2] = static_cast(i4); perm[3] = static_cast(i2); } } else { perm[0] = static_cast(i3); perm[1] = static_cast(i4); perm[2] = static_cast(ib); perm[3] = static_cast(i2); } } idx[k - 3] = idx4[perm[0] - 1]; idx[k - 2] = idx4[perm[1] - 1]; idx[k - 1] = idx4[perm[2] - 1]; idx[k] = idx4[perm[3] - 1]; x[k - 3] = x4[perm[0] - 1]; x[k - 2] = x4[perm[1] - 1]; x[k - 1] = x4[perm[2] - 1]; x[k] = x4[perm[3] - 1]; ib = 0; } } if (ib > 0) { perm[1] = 0; perm[2] = 0; perm[3] = 0; if (ib == 1) { perm[0] = 1; } else if (ib == 2) { if (x4[0] <= x4[1]) { perm[0] = 1; perm[1] = 2; } else { perm[0] = 2; perm[1] = 1; } } else if (x4[0] <= x4[1]) { if (x4[1] <= x4[2]) { perm[0] = 1; perm[1] = 2; perm[2] = 3; } else if (x4[0] <= x4[2]) { perm[0] = 1; perm[1] = 3; perm[2] = 2; } else { perm[0] = 3; perm[1] = 1; perm[2] = 2; } } else if (x4[0] <= x4[2]) { perm[0] = 2; perm[1] = 1; perm[2] = 3; } else if (x4[1] <= x4[2]) { perm[0] = 2; perm[1] = 3; perm[2] = 1; } else { perm[0] = 3; perm[1] = 2; perm[2] = 1; } for (k = 0; k < ib; k++) { i2 = perm[k] - 1; i3 = (k - ib) + 16; idx[i3] = idx4[i2]; x[i3] = x4[i2]; } } std::memset(&iwork[0], 0, 16U * sizeof(int)); i3 = 4; i2 = 4; while (i3 > 1) { if ((i3 & 1) != 0) { i3--; ib = i2 * i3; if (16 - ib > i2) { merge(idx, x, ib, i2, 16 - (ib + i2), iwork, xwork); } } ib = i2 << 1; i3 >>= 1; for (k = 0; k < i3; k++) { merge(idx, x, k * ib, i2, i2, iwork, xwork); } i2 = ib; } if (16 > i2) { merge(idx, x, 0, i2, 16 - i2, iwork, xwork); } } // // Arguments : ::coder::array &x // Return Type : void // void sort(::coder::array &x) { array xwork; array idx; array iwork; double b_xwork[256]; double x4[4]; int b_iwork[256]; int idx4[4]; int ib; int quartetOffset; signed char perm[4]; idx.set_size(1, x.size(1)); quartetOffset = x.size(1); for (ib = 0; ib < quartetOffset; ib++) { idx[ib] = 0; } if (x.size(1) != 0) { int bLen; int b_n; int i2; int i3; int i4; int idx_tmp; int k; int n; int nNonNaN; n = x.size(1); b_n = x.size(1); x4[0] = 0.0; idx4[0] = 0; x4[1] = 0.0; idx4[1] = 0; x4[2] = 0.0; idx4[2] = 0; x4[3] = 0.0; idx4[3] = 0; quartetOffset = x.size(1); iwork.set_size(quartetOffset); for (ib = 0; ib < quartetOffset; ib++) { iwork[ib] = 0; } quartetOffset = x.size(1); xwork.set_size(quartetOffset); for (ib = 0; ib < quartetOffset; ib++) { xwork[ib] = 0.0; } bLen = 0; ib = -1; for (k = 0; k < b_n; k++) { if (std::isnan(x[k])) { idx_tmp = (b_n - bLen) - 1; idx[idx_tmp] = k + 1; xwork[idx_tmp] = x[k]; bLen++; } else { ib++; idx4[ib] = k + 1; x4[ib] = x[k]; if (ib + 1 == 4) { double d; double d1; quartetOffset = k - bLen; if (x4[0] <= x4[1]) { ib = 1; i2 = 2; } else { ib = 2; i2 = 1; } if (x4[2] <= x4[3]) { i3 = 3; i4 = 4; } else { i3 = 4; i4 = 3; } d = x4[ib - 1]; d1 = x4[i3 - 1]; if (d <= d1) { d = x4[i2 - 1]; if (d <= d1) { perm[0] = static_cast(ib); perm[1] = static_cast(i2); perm[2] = static_cast(i3); perm[3] = static_cast(i4); } else if (d <= x4[i4 - 1]) { perm[0] = static_cast(ib); perm[1] = static_cast(i3); perm[2] = static_cast(i2); perm[3] = static_cast(i4); } else { perm[0] = static_cast(ib); perm[1] = static_cast(i3); perm[2] = static_cast(i4); perm[3] = static_cast(i2); } } else { d1 = x4[i4 - 1]; if (d <= d1) { if (x4[i2 - 1] <= d1) { perm[0] = static_cast(i3); perm[1] = static_cast(ib); perm[2] = static_cast(i2); perm[3] = static_cast(i4); } else { perm[0] = static_cast(i3); perm[1] = static_cast(ib); perm[2] = static_cast(i4); perm[3] = static_cast(i2); } } else { perm[0] = static_cast(i3); perm[1] = static_cast(i4); perm[2] = static_cast(ib); perm[3] = static_cast(i2); } } idx[quartetOffset - 3] = idx4[perm[0] - 1]; idx[quartetOffset - 2] = idx4[perm[1] - 1]; idx[quartetOffset - 1] = idx4[perm[2] - 1]; idx[quartetOffset] = idx4[perm[3] - 1]; x[quartetOffset - 3] = x4[perm[0] - 1]; x[quartetOffset - 2] = x4[perm[1] - 1]; x[quartetOffset - 1] = x4[perm[2] - 1]; x[quartetOffset] = x4[perm[3] - 1]; ib = -1; } } } i3 = (b_n - bLen) - 1; if (ib + 1 > 0) { perm[1] = 0; perm[2] = 0; perm[3] = 0; if (ib + 1 == 1) { perm[0] = 1; } else if (ib + 1 == 2) { if (x4[0] <= x4[1]) { perm[0] = 1; perm[1] = 2; } else { perm[0] = 2; perm[1] = 1; } } else if (x4[0] <= x4[1]) { if (x4[1] <= x4[2]) { perm[0] = 1; perm[1] = 2; perm[2] = 3; } else if (x4[0] <= x4[2]) { perm[0] = 1; perm[1] = 3; perm[2] = 2; } else { perm[0] = 3; perm[1] = 1; perm[2] = 2; } } else if (x4[0] <= x4[2]) { perm[0] = 2; perm[1] = 1; perm[2] = 3; } else if (x4[1] <= x4[2]) { perm[0] = 2; perm[1] = 3; perm[2] = 1; } else { perm[0] = 3; perm[1] = 2; perm[2] = 1; } for (k = 0; k <= ib; k++) { idx_tmp = perm[k] - 1; quartetOffset = (i3 - ib) + k; idx[quartetOffset] = idx4[idx_tmp]; x[quartetOffset] = x4[idx_tmp]; } } ib = (bLen >> 1) + 1; for (k = 0; k <= ib - 2; k++) { quartetOffset = (i3 + k) + 1; i2 = idx[quartetOffset]; idx_tmp = (b_n - k) - 1; idx[quartetOffset] = idx[idx_tmp]; idx[idx_tmp] = i2; x[quartetOffset] = xwork[idx_tmp]; x[idx_tmp] = xwork[quartetOffset]; } if ((bLen & 1) != 0) { ib += i3; x[ib] = xwork[ib]; } nNonNaN = n - bLen; quartetOffset = 2; if (nNonNaN > 1) { if (n >= 256) { int nBlocks; nBlocks = nNonNaN >> 8; if (nBlocks > 0) { for (int b{0}; b < nBlocks; b++) { i4 = (b << 8) - 1; for (int b_b{0}; b_b < 6; b_b++) { bLen = 1 << (b_b + 2); b_n = bLen << 1; n = 256 >> (b_b + 3); for (k = 0; k < n; k++) { i2 = (i4 + k * b_n) + 1; for (quartetOffset = 0; quartetOffset < b_n; quartetOffset++) { ib = i2 + quartetOffset; b_iwork[quartetOffset] = idx[ib]; b_xwork[quartetOffset] = x[ib]; } i3 = 0; quartetOffset = bLen; ib = i2 - 1; int exitg1; do { exitg1 = 0; ib++; if (b_xwork[i3] <= b_xwork[quartetOffset]) { idx[ib] = b_iwork[i3]; x[ib] = b_xwork[i3]; if (i3 + 1 < bLen) { i3++; } else { exitg1 = 1; } } else { idx[ib] = b_iwork[quartetOffset]; x[ib] = b_xwork[quartetOffset]; if (quartetOffset + 1 < b_n) { quartetOffset++; } else { ib -= i3; for (quartetOffset = i3 + 1; quartetOffset <= bLen; quartetOffset++) { idx_tmp = ib + quartetOffset; idx[idx_tmp] = b_iwork[quartetOffset - 1]; x[idx_tmp] = b_xwork[quartetOffset - 1]; } exitg1 = 1; } } } while (exitg1 == 0); } } } quartetOffset = nBlocks << 8; ib = nNonNaN - quartetOffset; if (ib > 0) { merge_block(idx, x, quartetOffset, ib, 2, iwork, xwork); } quartetOffset = 8; } } merge_block(idx, x, 0, nNonNaN, quartetOffset, iwork, xwork); } } } } // namespace internal } // namespace coder // // File trailer for sort.cpp // // [EOF] //