mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-06 11:18:30 +00:00
Make some sorting functions faster
This commit is contained in:
parent
1a839ba41d
commit
614229e3f4
3 changed files with 86 additions and 26 deletions
|
@ -19,20 +19,36 @@
|
|||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
|
||||
static void _intsorter(int *A, size_t n) {
|
||||
int t, p;
|
||||
size_t i, j;
|
||||
if (n < 2) return;
|
||||
for (p = A[n / 2], i = 0, j = n - 1;; i++, j--) {
|
||||
while (A[i] < p) i++;
|
||||
while (A[j] > p) j--;
|
||||
if (i >= j) break;
|
||||
static inline void InsertionSort(int *A, long n) {
|
||||
long i, j, t;
|
||||
for (i = 1; i < n; i++) {
|
||||
t = A[i];
|
||||
A[i] = A[j];
|
||||
A[j] = t;
|
||||
j = i - 1;
|
||||
while (j >= 0 && A[j] > t) {
|
||||
A[j + 1] = A[j];
|
||||
j = j - 1;
|
||||
}
|
||||
A[j + 1] = t;
|
||||
}
|
||||
}
|
||||
|
||||
static void IntSort(int *A, long n) {
|
||||
int t, p;
|
||||
long i, j;
|
||||
if (n <= 32) {
|
||||
InsertionSort(A, n);
|
||||
} else {
|
||||
for (p = A[n >> 1], i = 0, j = n - 1;; i++, j--) {
|
||||
while (A[i] < p) i++;
|
||||
while (A[j] > p) j--;
|
||||
if (i >= j) break;
|
||||
t = A[i];
|
||||
A[i] = A[j];
|
||||
A[j] = t;
|
||||
}
|
||||
IntSort(A, i);
|
||||
IntSort(A + i, n - i);
|
||||
}
|
||||
_intsorter(A, i);
|
||||
_intsorter(A + i, n - i);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -40,7 +56,7 @@ static void _intsorter(int *A, size_t n) {
|
|||
* @see djbsort
|
||||
*/
|
||||
void _intsort(int *A, size_t n) {
|
||||
_intsorter(A, n);
|
||||
IntSort(A, n);
|
||||
if (n > 1000) {
|
||||
STRACE("_intsort(%p, %'zu)", A, n);
|
||||
}
|
||||
|
|
|
@ -19,20 +19,35 @@
|
|||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
|
||||
static void _longsorter(long *A, size_t n) {
|
||||
long t, p;
|
||||
size_t i, j;
|
||||
if (n < 2) return;
|
||||
for (p = A[n / 2], i = 0, j = n - 1;; i++, j--) {
|
||||
while (A[i] < p) i++;
|
||||
while (A[j] > p) j--;
|
||||
if (i >= j) break;
|
||||
static inline void InsertionSort(long *A, long n) {
|
||||
long i, j, t;
|
||||
for (i = 1; i < n; i++) {
|
||||
t = A[i];
|
||||
A[i] = A[j];
|
||||
A[j] = t;
|
||||
j = i - 1;
|
||||
while (j >= 0 && A[j] > t) {
|
||||
A[j + 1] = A[j];
|
||||
j = j - 1;
|
||||
}
|
||||
A[j + 1] = t;
|
||||
}
|
||||
}
|
||||
|
||||
static void LongSort(long *A, long n) {
|
||||
long t, p, i, j;
|
||||
if (n <= 32) {
|
||||
InsertionSort(A, n);
|
||||
} else {
|
||||
for (p = A[n >> 1], i = 0, j = n - 1;; i++, j--) {
|
||||
while (A[i] < p) i++;
|
||||
while (A[j] > p) j--;
|
||||
if (i >= j) break;
|
||||
t = A[i];
|
||||
A[i] = A[j];
|
||||
A[j] = t;
|
||||
}
|
||||
LongSort(A, i);
|
||||
LongSort(A + i, n - i);
|
||||
}
|
||||
_longsorter(A, i);
|
||||
_longsorter(A + i, n - i);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -43,7 +58,7 @@ static void _longsorter(long *A, size_t n) {
|
|||
*
|
||||
*/
|
||||
void _longsort(long *A, size_t n) {
|
||||
_longsorter(A, n);
|
||||
LongSort(A, n);
|
||||
if (n > 1000) {
|
||||
STRACE("_longsort(%p, %'zu)", A, n);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue