[英]Recursive Merge Sort Java Program
我一直在研究合並排序遞歸代碼,但遇到了麻煩。 我已經在很多紙上遍歷了互聯網和算法本身,但似乎無法找出問題所在。
public static int[] mergesort(int[] data, int low, int high)
{
int middle = (high+low)/2;
if (middle==low)
{
int[] data2 = new int [1];
data2[0]=data[middle];
return data2;
}
else
{
int[] firstHalfSorted = mergesort(data, low, middle);
int[] secondHalfSorted = mergesort(data, middle+1, high);
return (merge(firstHalfSorted, secondHalfSorted));
}
}
public static int[] merge(int[] firstHalfSorted, int[] secondHalfSorted)
{
int[] SortedArray = new int[firstHalfSorted.length+secondHalfSorted.length];
int m = 0;
int n = 0;
int count = 0;
while (m<firstHalfSorted.length && n<secondHalfSorted.length)
{
if (firstHalfSorted[m]>secondHalfSorted[n])
{
SortedArray[count]=secondHalfSorted[n];
count++;
n++;
}
else if (firstHalfSorted[m]<secondHalfSorted[n])
{
SortedArray[count]=firstHalfSorted[m];
count++;
m++;
}
}
if (m!=firstHalfSorted.length)
{
while(m<firstHalfSorted.length){
SortedArray[count]=firstHalfSorted[m];
count++;
m++;
}
}
if (n!=secondHalfSorted.length)
{
while(n<secondHalfSorted.length){
SortedArray[count]=secondHalfSorted[n];
count++;
n++;
}
}
return SortedArray;
}
有代碼。 問題是來自文本輸入文件,該文件的編號依次為3,9,7,2,10,5,1,8,該代碼僅對其他每個數字進行排序,分別為3,7和10,1,然后是3, 7,1,10。
以我的全部想法,它應該排序3,9然后7,2,依此類推,依次為3,9,7,2和10,5,1,8等等,依此類推,但事實並非如此! 你們可以幫我嗎?
據我所知,有問題的代碼是:
if (middle==low)
{
int[] data2 = new int [1];
data2[0]=data[middle];
return data2;
}
當high-low<=1
時,此代碼將返回一個元素數組。 因此,對於low = 0, high=1
方法將在期望返回排序的兩元素數組時返回第零個元素。 您可以將其更改為:
if(low==high) //one element passed
//same here
您必須在此處更改以下兩件事:
1) if (middle==low)
前一篇文章所述,將if (middle==low)
)更改為if (high==low)
。
2)將else if (firstHalfSorted[m] **<** secondHalfSorted[n])
更改為else if (firstHalfSorted[m] **<=** secondHalfSorted[n])
或簡單地else
。
第二點很重要,因為當前您的代碼不支持重復的數字。 換句話說,在firstHalfSorted[m]
和secondHalfSorted[n]
相等的情況下, if-else
並不考慮所有情況,則它們不是窮舉的。
對於合並排序,您只需要將數據分為兩部分,在這兩個部分上遞歸,然后合並即可。 與其嘗試通過查找中間值或您嘗試執行的操作來嘗試對數據進行划分,不如將整個列表分為兩半。
例如:
private int[] mergesort(int[] data) {
int[] half1 = new int[data.length / 2];
int[] half2 = new int[(data.length % 2 == 0)? data.length / 2 : data.length / 2 + 1];
for (int i = 0; 2 * i < data.length; i++) {
half2[i] = data[2 * i];
if (2 * i + 1 < data.length) half1[i] = data[2 * i + 1];
}
int[] firstHalfSorted = mergesort(half1);
int[] secondHalfSorted = mergesort(half2);
return merge(firstHalfSorted, secondHalfSorted);
}
如果要保留當前方法(實際上看起來應該可以使用),則只需通過將if (middle == low)
更改為if (high == low)
來修復整數除法錯誤。
這是帶有遞歸的簡單合並排序代碼。
public class solution {
public static void merge(int[] input, int s, int e){
int m = (s + e) / 2;
int temp[] = new int[e - s + 1];
int s1 = s;
int s2 = m + 1;
int i = s1;
int j = s2;
int p = 0;
while(i <= m && j <= e){
if(input[i] > input[j]){
temp[p] = input[j];
j++;
p++;
}else{
temp[p] = input[i];
i++;
p++;
}
}//end of while loop
while(i <= m){
temp[p] = input[i];
p++;
i++;
}
while(j <= e){
temp[p] = input[j];
p++;
j++;
}
for(int k = 0; k < temp.length; k++){
input[s + k] = temp[k];
}
}
public static void callsort(int[] input, int s, int e){
if(s >= e){
return ;
}
int m = (s + e) / 2;
callsort(input, s, m);
callsort(input, m + 1, e);
merge(input, s, e);
}
public static void mergeSort(int[] input){
callsort(input , 0 , input.length - 1);
}
}
輸入:5 6 3 2 1 4輸出:1 2 3 4 5 6
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.