合并排序,通过将随机数组分成两半然后按数字顺序排序进行排序。概念被称为“分而治之”。输出乱序,我没有看到这个代码有什么问题。 Main只输出数组中的所有数字。仅供参考,代码的其他部分不是问题。但如果你需要它,我可以把它给你。
private void merge(int[] a, int first, int mid, int last)
{
int size = last - first + 1;
int [] temp = new int[size];
int i = first, j = mid + 1;
for(int s = 0; s < size; s++){ // a.length
if(i > mid){ // case a
temp[s] = a[j];
j++;
}else if(j > last){ // case b
temp[s] = a[i];
i++;
}else if(a[i] < a[j]){ // case c
temp[s] = a[i];
i++;
}else if(a[j] <= a[i]){ // case d
temp[s] = a[j];
j++;
}
}
for(int s = first; s < size; s++){
a[first] = temp[s - first];
}
}
public void mergeSort(int[] a, int first, int last)
{
int size = last - first + 1, mid;
if(size == 1){
steps++;
}else if(size == 2){
if(a[last] > a[first]){
int temp = a[last];
a[last] = a[first];
a[first] = temp;
steps += 3;
}
}else{
mid = (last + first) / 2;
mergeSort(a, first, mid);
mergeSort(a, mid + 1, last);
merge(a, first, mid, last);
steps += 4;
}
}
这就是生成器的样子:
private void fillArray(int numInts, int largestInt)
{
myArray = new int[numInts];
Random randGen = new Random();
for(int loop = 0; loop < myArray.length; loop++){
myArray[loop] = randGen.nextInt(largestInt) + 1;
}
}
答案 0 :(得分:1)
您的代码中存在两个缺陷:
第一
for(int s = first; s - first < size; s++){// replace s<size with s-first<size
a[s] = temp[s - first];//yours a[first] = temp[s-first]
}
在您的编码中,首先修复,它将始终更新a [first],我认为这不是您想要的。
第二
....
}else if(a[i] > a[j]){ // case c yours a[i]<a[j]
temp[s] = a[i];
i++;
}else if(a[i] <= a[j]){ // case d yours a[j] <= a[i]
temp[s] = a[j];
j++;
}
....
因为关于你的排序,你会得到一个下降序列,并且在合并中你想得到升序,这就相互冲突了。