Swift, 133137 bytes
{n infunc f(n:Int){var l=Array(1...n).map{$0>3 ?0:$0},p=8;if n>3{for i in 3..<n{if l[i]<1{l[i]=l[i-1]+1};if l[i]<n{l[l[i]]=p};p*=2}};return l}as;print(Intl)->[Int]}
Takes input as Int (integer) and returnsprints as [Int] (integer array). Example usage:
Ungolfed version
letfunc f:(Int)->[Int]={n in var l=Array(1...n).map{$0>3 ?0:$0},p=8;if n>3{for i in 3..<n{if l[i]<1{l[i]=l[i-1]+1};if l[i]<n{l[l[i]]=p};p*=2}};return l}
print(f(20)Int)
Ungolfed version
{n in
var l = Array(1...n).map{$0 > 3 ? 0 : $0} // Create the range from 1 to n and set all
var p = 8 // values greater than 3 to 0
if n > 3 {
for i in 3 ..< n {
if l[i] < 1 {
l[i] = l[i - 1] + 1
}
if l[i] < n {
l[l[i]] = p
}
p *= 2
}
}
return print(l)
}as(Int)->[Int]