이 질문을 게시하기 전에 내 문제와 관련된 질문을 확인했지만 유용하지 않은 항목을 확인했습니다. 정수 배열에서 중복 항목을 삭제하기 위해 병합 정렬 알고리즘을 수정하려고합니다. 불행히도, 내가 얻은 유일한 결과는 중복 된 엔트리가 0으로 대체 된 배열입니다.병합 정렬을 사용하여 배열의 중복 항목을 제거합니다.
내가 몇 가지 근본적인 지점을 놓치고 : 여기
public static int[] mergeSort(int[] array, int left, int right){
int[] sortedArray = null;
if(left == right){
sortedArray = new int[1];
sortedArray[0] = array[left];
return sortedArray;
}
int mid = (left+right)/2;
int[] subA = mergeSort(array, left, mid);
int[] subB = mergeSort(array, mid+1, right);
sortedArray = merge(subA, subB);
return sortedArray;
}
private static int[] merge(int[] subA, int[]subB){
int[] mergedArray = new int[subA.length+subB.length];
int i, j, k;
i = 0;
j = 0;
k = 0;
while(i < subA.length && j < subB.length){
if(subA[i] < subB[j]){
mergedArray[k] = subA[i];
i++;
}
else if(subA[i] > subB[j]){
mergedArray[k] = subB[j];
j++;
}
//if the two elements are equal
else{
mergedArray[k] = subA[i];
i++;
j++;
}
k++;
}
if(j >= subB.length){
while(i < subA.length){
mergedArray[k] = subA[i];
i++;
k++;
}
}
else{
while(j < subB.length){
mergedArray[k] = subB[j];
j++;
k++;
}
}
return mergedArray;
}
위 코드의 출력? 이 제로 반복없이 고유 한 요소의 배열을 얻기 위해이 코드를 수정하는 효과적인 방법이 있습니까?
0 값을 쓰지 않는 새 배열을 만드는 것이 왜 좋을까요? 감지 할 수있는 고유 요소의 수를 카운터 한 다음 새 배열이 얼마나 커야 하는지를 알 수 있습니다. –
나는 또한 이런 식으로 생각했다. 불행히도 하나 이상의 0이 초기 배열의 요소 인 경우를 제외하지 않고 "올바른"0을 "잘못된"0과 구별하는 것이 불가능할 것이다. –
하지만 어쨌든 0을 하나만 유지해야합니다. 맞습니까? 그래서 정렬이 끝나면 내용을 새로운 배열에 복사하고 요소가 음수 또는 경계가되기 전에 요소를 복사하고 양수 또는 경계 뒤에 요소 만 복사합니까? 그래도 원래 배열에 0이 있는지 여부를 추적해야하지만이 방법도 첫 번째 단계에서 수행 할 수 있습니다. –