|
|
@@ -0,0 +1,89 @@ |
|
|
|
#!/usr/bin/env python3 |
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
""" |
|
|
|
Created on Fri May 21 12:18:02 2021 |
|
|
|
|
|
|
|
@author: ljia |
|
|
|
""" |
|
|
|
|
|
|
|
def dichotomous_permutation(arr, layer=0): |
|
|
|
import math |
|
|
|
|
|
|
|
# def seperate_arr(arr, new_arr): |
|
|
|
# if (length % 2) == 0: |
|
|
|
# half = int(length / 2) |
|
|
|
# new_arr += [arr[half - 1], arr[half]] |
|
|
|
# subarr1 = [arr[i] for i in range(1, half - 1)] |
|
|
|
# else: |
|
|
|
# half = math.floor(length / 2) |
|
|
|
# new_arr.append(arr[half]) |
|
|
|
# subarr1 = [arr[i] for i in range(1, half)] |
|
|
|
# subarr2 = [arr[i] for i in range(half + 1, length - 1)] |
|
|
|
# subarrs = [subarr1, subarr2] |
|
|
|
# return subarrs |
|
|
|
|
|
|
|
|
|
|
|
if layer == 0: |
|
|
|
length = len(arr) |
|
|
|
if length <= 2: |
|
|
|
return arr |
|
|
|
|
|
|
|
new_arr = [arr[0], arr[-1]] |
|
|
|
if (length % 2) == 0: |
|
|
|
half = int(length / 2) |
|
|
|
new_arr += [arr[half - 1], arr[half]] |
|
|
|
subarr1 = [arr[i] for i in range(1, half - 1)] |
|
|
|
else: |
|
|
|
half = math.floor(length / 2) |
|
|
|
new_arr.append(arr[half]) |
|
|
|
subarr1 = [arr[i] for i in range(1, half)] |
|
|
|
subarr2 = [arr[i] for i in range(half + 1, length - 1)] |
|
|
|
subarrs = [subarr1, subarr2] |
|
|
|
# subarrs = seperate_arr(arr, new_arr) |
|
|
|
new_arr += dichotomous_permutation(subarrs, layer=layer+1) |
|
|
|
|
|
|
|
else: |
|
|
|
new_arr = [] |
|
|
|
subarrs = [] |
|
|
|
for a in arr: |
|
|
|
length = len(a) |
|
|
|
if length <= 2: |
|
|
|
new_arr += a |
|
|
|
else: |
|
|
|
# subarrs += seperate_arr(a, new_arr) |
|
|
|
if (length % 2) == 0: |
|
|
|
half = int(length / 2) |
|
|
|
new_arr += [a[half - 1], a[half]] |
|
|
|
subarr1 = [a[i] for i in range(0, half - 1)] |
|
|
|
else: |
|
|
|
half = math.floor(length / 2) |
|
|
|
new_arr.append(a[half]) |
|
|
|
subarr1 = [a[i] for i in range(0, half)] |
|
|
|
subarr2 = [a[i] for i in range(half + 1, length)] |
|
|
|
subarrs += [subarr1, subarr2] |
|
|
|
|
|
|
|
if len(subarrs) > 0: |
|
|
|
new_arr += dichotomous_permutation(subarrs, layer=layer+1) |
|
|
|
|
|
|
|
return new_arr |
|
|
|
|
|
|
|
# length = len(arr) |
|
|
|
# if length <= 2: |
|
|
|
# return arr |
|
|
|
|
|
|
|
# new_arr = [arr[0], arr[-1]] |
|
|
|
# if (length % 2) == 0: |
|
|
|
# half = int(length / 2) |
|
|
|
# new_arr += [arr[half - 1], arr[half]] |
|
|
|
# subarr1 = [arr[i] for i in range(1, half - 1)] |
|
|
|
# else: |
|
|
|
# half = math.floor(length / 2) |
|
|
|
# new_arr.append(arr[half]) |
|
|
|
# subarr1 = [arr[i] for i in range(1, half)] |
|
|
|
# subarr2 = [arr[i] for i in range(half + 1, length - 1)] |
|
|
|
# if len(subarr1) > 0: |
|
|
|
# new_arr += dichotomous_permutation(subarr1) |
|
|
|
# if len(subarr2) > 0: |
|
|
|
# new_arr += dichotomous_permutation(subarr2) |
|
|
|
|
|
|
|
# return new_arr |