JSFiddle - React, Tailwind, and code Playground

by alhambra1

HTML

<div id="output"></div>

JavaScript

var a = [2,1,3,5,4,0]
  , b = [4,2,0,6,1,3,7,5]
  
function rearrange(arr){
    var visited = 0,tmp,indexes,zeroTo

    function cycle(startIx){
        tmp = {start: startIx, value: arr[startIx]}
        indexes = {from: arr[startIx], to: startIx}

        while (indexes.from != tmp.start){
            if (arr[indexes.from] == 0)
                zeroTo = indexes.to
            if (indexes.to == visited){
                visited++
                arr[indexes.to] = arr[indexes.from]
            } else {
                arr[indexes.to] = -arr[indexes.from]
            }
            indexes.to = indexes.from
            if (indexes.from != tmp.start)
                indexes.from = arr[indexes.from]
        }

        if (indexes.to == visited){
            visited++
            arr[indexes.to] = tmp.value
        } else {
            arr[indexes.to] = -tmp.value
        }
    }

    while (visited < arr.length - 1){
        cycle(visited)

        while (arr[visited] < 0 || visited == zeroTo){
            arr[visited] = -arr[visited]
            visited++
        }
    }

    return arr
}

document.getElementById("output").innerHTML = 
    "<p>" + JSON.stringify(a) + "<br />"
  + JSON.stringify(rearrange(a)) + "</p><p>"
  + JSON.stringify(b) + "<br />"
  + JSON.stringify(rearrange(b)) + "</p>"