/** Compute the length of the next run, make the run sorted and return its * length. */ int nextRun() { final int runBase = runEnd(0); assert runBase < to; if (runBase == to - 1) { return 1; } int o = runBase + 2; if (compare(runBase, runBase+1) > 0) { // run must be strictly descending while (o < to && compare(o - 1, o) > 0) { ++o; } reverse(runBase, o); } else { // run must be non-descending while (o < to && compare(o - 1, o) <= 0) { ++o; } } final int runHi = Math.max(o, Math.min(to, runBase + minRun)); binarySort(runBase, runHi, o); return runHi - runBase; }
void mergeLo(int lo, int mid, int hi) { assert compare(lo, mid) > 0; int len1 = mid - lo; save(lo, len1); copy(mid, lo); int i = 0, j = mid + 1, dest = lo + 1; outer: for (;;) { for (int count = 0; count < MIN_GALLOP; ) { if (i >= len1 || j >= hi) { break outer; } else if (compareSaved(i, j) <= 0) { restore(i++, dest++); count = 0; } else { copy(j++, dest++); ++count; } } // galloping... int next = lowerSaved3(j, hi, i); for (; j < next; ++dest) { copy(j++, dest); } restore(i++, dest++); } for (; i < len1; ++dest) { restore(i++, dest); } assert j == dest; }
void mergeHi(int lo, int mid, int hi) { assert compare(mid - 1, hi - 1) > 0; int len2 = hi - mid; save(mid, len2); copy(mid - 1, hi - 1); int i = mid - 2, j = len2 - 1, dest = hi - 2; outer: for (;;) { for (int count = 0; count < MIN_GALLOP; ) { if (i < lo || j < 0) { break outer; } else if (compareSaved(j, i) >= 0) { restore(j--, dest--); count = 0; } else { copy(i--, dest--); ++count; } } // galloping int next = upperSaved3(lo, i + 1, j); while (i >= next) { copy(i--, dest--); } restore(j--, dest--); } for (; j >= 0; --dest) { restore(j--, dest); } assert i == dest; }
void merge(int lo, int mid, int hi) { if (compare(mid - 1, mid) <= 0) { return; } lo = upper2(lo, mid, mid); hi = lower2(mid, hi, mid - 1); if (hi - mid <= mid - lo && hi - mid <= maxTempSlots) { mergeHi(lo, mid, hi); } else if (mid - lo <= maxTempSlots) { mergeLo(lo, mid, hi); } else { mergeInPlace(lo, mid, hi); } }
void mergeHi(int lo, int mid, int hi) { assert compare(mid - 1, hi - 1) > 0; int len2 = hi - mid; save(mid, len2); copy(mid - 1, hi - 1); int i = mid - 2, j = len2 - 1, dest = hi - 2; outer: for (;;) { for (int count = 0; count < MIN_GALLOP; ) { if (i < lo || j < 0) { break outer; } else if (compareSaved(j, i) >= 0) { restore(j--, dest--); count = 0; } else { copy(i--, dest--); ++count; } } // galloping int next = upperSaved3(lo, i + 1, j); while (i >= next) { copy(i--, dest--); } restore(j--, dest--); } for (; j >= 0; --dest) { restore(j--, dest); } assert i == dest; }
/** Compute the length of the next run, make the run sorted and return its * length. */ int nextRun() { final int runBase = runEnd(0); assert runBase < to; if (runBase == to - 1) { return 1; } int o = runBase + 2; if (compare(runBase, runBase+1) > 0) { // run must be strictly descending while (o < to && compare(o - 1, o) > 0) { ++o; } reverse(runBase, o); } else { // run must be non-descending while (o < to && compare(o - 1, o) <= 0) { ++o; } } final int runHi = Math.max(o, Math.min(to, runBase + minRun)); binarySort(runBase, runHi, o); return runHi - runBase; }
void mergeLo(int lo, int mid, int hi) { assert compare(lo, mid) > 0; int len1 = mid - lo; save(lo, len1); copy(mid, lo); int i = 0, j = mid + 1, dest = lo + 1; outer: for (;;) { for (int count = 0; count < MIN_GALLOP; ) { if (i >= len1 || j >= hi) { break outer; } else if (compareSaved(i, j) <= 0) { restore(i++, dest++); count = 0; } else { copy(j++, dest++); ++count; } } // galloping... int next = lowerSaved3(j, hi, i); for (; j < next; ++dest) { copy(j++, dest); } restore(i++, dest++); } for (; i < len1; ++dest) { restore(i++, dest); } assert j == dest; }
/** Compute the length of the next run, make the run sorted and return its * length. */ int nextRun() { final int runBase = runEnd(0); assert runBase < to; if (runBase == to - 1) { return 1; } int o = runBase + 2; if (compare(runBase, runBase+1) > 0) { // run must be strictly descending while (o < to && compare(o - 1, o) > 0) { ++o; } reverse(runBase, o); } else { // run must be non-descending while (o < to && compare(o - 1, o) <= 0) { ++o; } } final int runHi = Math.max(o, Math.min(to, runBase + minRun)); binarySort(runBase, runHi, o); return runHi - runBase; }
void mergeHi(int lo, int mid, int hi) { assert compare(mid - 1, hi - 1) > 0; int len2 = hi - mid; save(mid, len2); copy(mid - 1, hi - 1); int i = mid - 2, j = len2 - 1, dest = hi - 2; outer: for (;;) { for (int count = 0; count < MIN_GALLOP; ) { if (i < lo || j < 0) { break outer; } else if (compareSaved(j, i) >= 0) { restore(j--, dest--); count = 0; } else { copy(i--, dest--); ++count; } } // galloping int next = upperSaved3(lo, i + 1, j); while (i >= next) { copy(i--, dest--); } restore(j--, dest--); } for (; j >= 0; --dest) { restore(j--, dest); } assert i == dest; }
/** Compute the length of the next run, make the run sorted and return its * length. */ int nextRun() { final int runBase = runEnd(0); assert runBase < to; if (runBase == to - 1) { return 1; } int o = runBase + 2; if (compare(runBase, runBase+1) > 0) { // run must be strictly descending while (o < to && compare(o - 1, o) > 0) { ++o; } reverse(runBase, o); } else { // run must be non-descending while (o < to && compare(o - 1, o) <= 0) { ++o; } } final int runHi = Math.max(o, Math.min(to, runBase + minRun)); binarySort(runBase, runHi, o); return runHi - runBase; }
void mergeLo(int lo, int mid, int hi) { assert compare(lo, mid) > 0; int len1 = mid - lo; save(lo, len1); copy(mid, lo); int i = 0, j = mid + 1, dest = lo + 1; outer: for (;;) { for (int count = 0; count < MIN_GALLOP; ) { if (i >= len1 || j >= hi) { break outer; } else if (compareSaved(i, j) <= 0) { restore(i++, dest++); count = 0; } else { copy(j++, dest++); ++count; } } // galloping... int next = lowerSaved3(j, hi, i); for (; j < next; ++dest) { copy(j++, dest); } restore(i++, dest++); } for (; i < len1; ++dest) { restore(i++, dest); } assert j == dest; }
void merge(int lo, int mid, int hi) { if (compare(mid - 1, mid) <= 0) { return; } lo = upper2(lo, mid, mid); hi = lower2(mid, hi, mid - 1); if (hi - mid <= mid - lo && hi - mid <= maxTempSlots) { mergeHi(lo, mid, hi); } else if (mid - lo <= maxTempSlots) { mergeLo(lo, mid, hi); } else { mergeInPlace(lo, mid, hi); } }
void mergeHi(int lo, int mid, int hi) { assert compare(mid - 1, hi - 1) > 0; int len2 = hi - mid; save(mid, len2); copy(mid - 1, hi - 1); int i = mid - 2, j = len2 - 1, dest = hi - 2; outer: for (;;) { for (int count = 0; count < MIN_GALLOP; ) { if (i < lo || j < 0) { break outer; } else if (compareSaved(j, i) >= 0) { restore(j--, dest--); count = 0; } else { copy(i--, dest--); ++count; } } // galloping int next = upperSaved3(lo, i + 1, j); while (i >= next) { copy(i--, dest--); } restore(j--, dest--); } for (; j >= 0; --dest) { restore(j--, dest); } assert i == dest; }
void merge(int lo, int mid, int hi) { if (compare(mid - 1, mid) <= 0) { return; } lo = upper2(lo, mid, mid); hi = lower2(mid, hi, mid - 1); if (hi - mid <= mid - lo && hi - mid <= maxTempSlots) { mergeHi(lo, mid, hi); } else if (mid - lo <= maxTempSlots) { mergeLo(lo, mid, hi); } else { mergeInPlace(lo, mid, hi); } }
void mergeLo(int lo, int mid, int hi) { assert compare(lo, mid) > 0; int len1 = mid - lo; save(lo, len1); copy(mid, lo); int i = 0, j = mid + 1, dest = lo + 1; outer: for (;;) { for (int count = 0; count < MIN_GALLOP; ) { if (i >= len1 || j >= hi) { break outer; } else if (compareSaved(i, j) <= 0) { restore(i++, dest++); count = 0; } else { copy(j++, dest++); ++count; } } // galloping... int next = lowerSaved3(j, hi, i); for (; j < next; ++dest) { copy(j++, dest); } restore(i++, dest++); } for (; i < len1; ++dest) { restore(i++, dest); } assert j == dest; }
void merge(int lo, int mid, int hi) { if (compare(mid - 1, mid) <= 0) { return; } lo = upper2(lo, mid, mid); hi = lower2(mid, hi, mid - 1); if (hi - mid <= mid - lo && hi - mid <= maxTempSlots) { mergeHi(lo, mid, hi); } else if (mid - lo <= maxTempSlots) { mergeLo(lo, mid, hi); } else { mergeInPlace(lo, mid, hi); } }