Sorting 有没有办法优化这个Mergesort实现?
我为任何非常规的写作模式或任何其他明显的错误提前道歉。任何建议或提示将不胜感激Sorting 有没有办法优化这个Mergesort实现?,sorting,Sorting,我为任何非常规的写作模式或任何其他明显的错误提前道歉。任何建议或提示将不胜感激 public class MergeSort { private static final int INSERTION_THRESHOLD = 8; public static void mergeSort(int[] x) { mergeSort(x, 0, x.length); } private static void mergeSort(int[] x, in
public class MergeSort {
private static final int INSERTION_THRESHOLD = 8;
public static void mergeSort(int[] x) {
mergeSort(x, 0, x.length);
}
private static void mergeSort(int[] x, int start, int end) {
int length=end-start;
if(length<INSERTION_THRESHOLD) {
for (int i=start; i<end; i++)
for (int j=i; j>start && x[j-1]>x[j]; j--)
swap(x, j, j-1);
return;
}
int mid=(start+end)>>>1;
mergeSort(x, 0, mid);
mergeSort(x, mid, end);
int[] space=Arrays.copyOfRange(x, 0, mid);
int i=0, j=mid, k=0;
while(i<mid&&j<end)
x[k++]=(x[j]<space[i])?x[j++]:space[i++];
while(i<mid)
x[k++]=space[i++];
}
private static void swap(int[] x, int n, int m) {
int temp = x[n];
x[n] = x[m];
x[m] = temp;
}
我在这里寻找的是任何建议或想法,可以使这成为一个更好的实现。我说得对吗,还是这里有一些非常搞笑的混乱?代码中是否有不必要的点?是否可以添加一些东西,使其运行更快速/平稳/更符合良好的合并排序要求?您可以查看不同语言中的不同合并排序实现,并找到适合您的最佳解决方案,也许可以改进现有代码。以下是该网站的PHP实现示例:
function mergesort($arr){
if(count($arr) == 1 ) return $arr;
$mid = count($arr) / 2;
$left = array_slice($arr, 0, $mid);
$right = array_slice($arr, $mid);
$left = mergesort($left);
$right = mergesort($right);
return merge($left, $right);
}
function merge($left, $right){
$res = array();
while (count($left) > 0 && count($right) > 0){
if($left[0] > $right[0]){
$res[] = $right[0];
$right = array_slice($right , 1);
}else{
$res[] = $left[0];
$left = array_slice($left, 1);
}
}
while (count($left) > 0){
$res[] = $left[0];
$left = array_slice($left, 1);
}
while (count($right) > 0){
$res[] = $right[0];
$right = array_slice($right, 1);
}
return $res;
}
$arr = array( 1, 5, 2, 7, 3, 9, 4, 6, 8);
$arr = mergesort($arr);
echo implode(',',$arr);
希望这会有帮助。以下是网站:
function mergesort($arr){
if(count($arr) == 1 ) return $arr;
$mid = count($arr) / 2;
$left = array_slice($arr, 0, $mid);
$right = array_slice($arr, $mid);
$left = mergesort($left);
$right = mergesort($right);
return merge($left, $right);
}
function merge($left, $right){
$res = array();
while (count($left) > 0 && count($right) > 0){
if($left[0] > $right[0]){
$res[] = $right[0];
$right = array_slice($right , 1);
}else{
$res[] = $left[0];
$left = array_slice($left, 1);
}
}
while (count($left) > 0){
$res[] = $left[0];
$left = array_slice($left, 1);
}
while (count($right) > 0){
$res[] = $right[0];
$right = array_slice($right, 1);
}
return $res;
}
$arr = array( 1, 5, 2, 7, 3, 9, 4, 6, 8);
$arr = mergesort($arr);
echo implode(',',$arr);