2024-09-disk-defrag/defrag.go
2024-12-09 12:30:41 -06:00

26 lines
617 B
Go

package defrag
// Defrag performs an in-place sort of blocks.
// If an error occurs during processing, it will be returned. The slice may have been partially sorted.
func Defrag(blocks []byte) error {
lastPulled := len(blocks)
lastPushed := -1
for block := 0; block < len(blocks); block++ {
if blocks[block] != '.' {
continue
}
if lastPulled <= block {
break
}
for swap := lastPulled - 1; swap > lastPushed; swap-- {
if blocks[swap] == '.' {
continue
}
blocks[block], blocks[swap] = blocks[swap], blocks[block]
lastPulled = swap
lastPushed = block
break
}
}
return nil
}