If the data really is similar in scope to your sample data, you could create a map like this:
map = [0 .. 150]
for each color:
for loc range start * 10 to range finish * 10:
map[loc] = color
Then just walk through this map to generate the ranges
curcolor = none
for loc in map:
if map[loc] != curcolor:
if curcolor:
rangeend = loc / 10
make new range
rangecolor = map[loc]
rangestart = loc / 10
To work, the values have to be in a relatively small range as in your sample data.
Edit: to work with true floats, use the map to generate a high level mapping and then refer to the original data to create the boundaries.
map = [0 .. 15]
for each color:
for loc round(range start) to round(range finish):
map[loc] = color
curcolor = none
for loc in map
if map[loc] != curcolor:
make new range
if loc = round(range[map[loc]].start)
rangestart = range[map[loc]].start
else
rangestart = previous rangeend
rangecolor = map[loc]
if curcolor:
if map[loc] == none:
last rangeend = range[map[loc]].end
else
last rangeend = rangestart
curcolor = rangecolor