private void BitonicSort(object AsyncState) { BitonicParameters parameters = (BitonicParameters)AsyncState; if (parameters.Length > 1) { if (parameters.Length > minimumLength) { int median = parameters.Length / 2; Thread left = new Thread(BitonicSort); Thread right = new Thread(BitonicSort); left.Start(new BitonicParameters(parameters.Index, median, Ascending)); right.Start(new BitonicParameters(parameters.Index + median, median, Descending)); left.Join(); right.Join(); } else { int median = (parameters.Length / 2); if (median > 1) { BitonicSort(new BitonicParameters(parameters.Index, median, Ascending)); BitonicSort(new BitonicParameters(parameters.Index, median, Ascending)); } } BitonicMerge(new BitonicParameters(parameters.Index, parameters.Length, parameters.Direction)); } }
private void BitonicMerge(object AsyncState) { BitonicParameters parameters = (BitonicParameters)AsyncState; if (parameters.Length > 1) { if (parameters.Length > minimumLength) { int median = (parameters.Length / 2); for (int i = parameters.Index; i < (parameters.Index + median); i++) { Compare(i, (i + median), parameters.Direction); } Thread left = new Thread(BitonicMerge); Thread right = new Thread(BitonicMerge); left.Start(new BitonicParameters(parameters.Index, median, parameters.Direction)); right.Start(new BitonicParameters(parameters.Index + median, median, parameters.Direction)); left.Join(); right.Join(); } else { int median = (parameters.Length / 2); for (int i = parameters.Index; i < (parameters.Index + median); i++) { Compare(i, (i + median), parameters.Direction); } if (median > 1) { BitonicMerge(new BitonicParameters(parameters.Index, median, parameters.Direction)); BitonicMerge(new BitonicParameters(parameters.Index + median, median, parameters.Direction)); } } } }