.. half closed range; ... open range; ... variadic syntax

This commit is contained in:
Ginger Bill
2017-07-07 23:42:43 +01:00
parent 45353465a6
commit 4b051a0d3b
19 changed files with 151 additions and 167 deletions
+18 -18
View File
@@ -7,7 +7,7 @@ bubble_sort :: proc(array: []$T, f: proc(T, T) -> int) {
for {
init_swap, prev_swap := -1, -1;
for j in init_j..<last_j {
for j in init_j..last_j {
if f(array[j], array[j+1]) > 0 {
array[j], array[j+1] = array[j+1], array[j];
prev_swap = j;
@@ -30,7 +30,7 @@ bubble_sort :: proc(array: []$T) {
for {
init_swap, prev_swap := -1, -1;
for j in init_j..<last_j {
for j in init_j..last_j {
if array[j] > array[j+1] {
array[j], array[j+1] = array[j+1], array[j];
prev_swap = j;
@@ -65,8 +65,8 @@ quick_sort :: proc(array: []$T, f: proc(T, T) -> int) {
j -= 1;
}
quick_sort(a[0..<i], f);
quick_sort(a[i..<n], f);
quick_sort(a[0..i], f);
quick_sort(a[i..n], f);
}
quick_sort :: proc(array: []$T) {
@@ -88,8 +88,8 @@ quick_sort :: proc(array: []$T) {
j -= 1;
}
quick_sort(a[0..<i]);
quick_sort(a[i..<n]);
quick_sort(a[0..i]);
quick_sort(a[i..n]);
}
_log2 :: proc(n: int) -> int {
@@ -102,7 +102,7 @@ merge_sort :: proc(array: []$T, f: proc(T, T) -> int) {
merge_slices :: proc(arr1, arr2, out: []$T, f: proc(T, T) -> int) {
N1, N2 := len(arr1), len(arr2);
i, j := 0, 0;
for k in 0..<N1+N2 {
for k in 0..N1+N2 {
if j == N2 || i < N1 && j < N2 && f(arr1[i], arr2[j]) < 0 {
out[k] = arr1[i]; i++;
} else {
@@ -120,16 +120,16 @@ merge_sort :: proc(array: []$T, f: proc(T, T) -> int) {
a, b, m, M := N/2, N, 1, _log2(N);
for i in 0..<M+1 {
for j in 0..<a {
for i in 0..M+1 {
for j in 0..a {
k := 2*j*m;
merge_slices(arr1[k..<k+m], arr1[k+m..<k+m+m], arr2[k..], f);
merge_slices(arr1[k..k+m], arr1[k+m..k+m+m], arr2[k..], f);
}
if N-b > m {
k := 2*a*m;
merge_slices(arr1[k..<k+m], arr1[k+m..<k+m+(N-b)&(m-1)], arr2[k..], f);
merge_slices(arr1[k..k+m], arr1[k+m..k+m+(N-b)&(m-1)], arr2[k..], f);
} else {
copy(arr2[b..N-1], arr1[b..N-1]);
copy(arr2[b..N], arr1[b..N]);
}
arr1, arr2 = arr2, arr1;
m <<= 1;
@@ -144,7 +144,7 @@ merge_sort :: proc(array: []$T) {
merge_slices :: proc(arr1, arr2, out: []$T) {
N1, N2 := len(arr1), len(arr2);
i, j := 0, 0;
for k in 0..<N1+N2 {
for k in 0..N1+N2 {
if j == N2 || i < N1 && j < N2 && arr1[i] < arr2[j] {
out[k] = arr1[i]; i++;
} else {
@@ -160,16 +160,16 @@ merge_sort :: proc(array: []$T) {
a, b, m, M := N/2, N, 1, _log2(N);
for i in 0..<M+1 {
for j in 0..<a {
for i in 0..M+1 {
for j in 0..a {
k := 2*j*m;
merge_slices(arr1[k..<k+m], arr1[k+m..<k+m+m], arr2[k..]);
merge_slices(arr1[k..k+m], arr1[k+m..k+m+m], arr2[k..]);
}
if N-b > m {
k := 2*a*m;
merge_slices(arr1[k..<k+m], arr1[k+m..<k+m+(N-b)&(m-1)], arr2[k..]);
merge_slices(arr1[k..k+m], arr1[k+m..k+m+(N-b)&(m-1)], arr2[k..]);
} else {
copy(arr2[b..N-1], arr1[b..N-1]);
copy(arr2[b..N], arr1[b..N]);
}
arr1, arr2 = arr2, arr1;
m <<= 1;