for ($i = 0; $i < sizeof($elements); $i++) { $temp_elements[$elements[$i]]++; } // After above loop, $temp_elements[$i] now contains number of elements // equal to $i. For example : // index: 0 1 2 3 4 5 // $elements = array(1, 1, 0, 0, 3, 1), after the loop : // // index: 0 1 2 3 // $temp_elements = array(2, 3, 0, 1) for ($i = 1; $i <= $k; $i++) { $temp_elements[$i] += $temp_elements[$i - 1]; } // After above loop, $temp_elements[$i] now contains number of elements // less than or equal to $i. For example: // index: 0 1 2 3 // $temp_elements = array(2, 3, 0, 1), after the loop : // index: 0 1 2 3 // $temp_elements = array(2, 5, 5, 6) for ($i = sizeof($elements) - 1; $i >= 0; $i--) { $sorted_elements[$temp_elements[$elements[$i]] - 1] = $elements[$i]; $temp_elements[$elements[$i]]--; } $elements = $sorted_elements; } // Example usage: $a = array(3, 5, 9, 8, 5, 7, 2, 1, 13, 2, 2, 4, 3, 1, 6); var_dump($a); counting_sort($a, 13); // Sort the elements, k = 13 var_dump($a);
public function testArrayWithRepeatedElements() { $original = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; $copy = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; $this->assertEquals(counting_sort($original), $copy); }