* @param a The total input array containing the partition to sort.
	 * @param start Index of the first element of the partition.
	 * @param end Index of the element succeeding last element of the partition.
	 */
	private <T extends Comparable<? super T>> void addWorker(final int index,
		final T[] a, final int start, final int end)
	{
		final Worker worker = workers[index] = new Worker(start, end)
		{
			@Override public void run()
			{
				sorter.sort(a, start, end);

				try
				{
					for(int j, i = 1;; i = j)
					{
						final int nextWorkerIndex = index + i;

						if(nextWorkerIndex == workers.length)
						{
							break;
						}

						j = i * 2;

						if(index % j != 0)
						{
							break;
						}

						final Worker mergeWorker = workers[nextWorkerIndex];

						mergeWorker.join();

						assert end == mergeWorker.start;

						merger.merge(a, start, end, mergeWorker.end);

						end = mergeWorker.end;

						if(start == 0 && end == a.length)
						{
							break;
						}
					}
				}
				catch(InterruptedException e)
				{
					throw new RuntimeException(e);
				}
			}
		};

		worker.start();
	}