정렬 테마 (3)/안정적인 내부 정렬/귀속 2 - 루트 병합 정렬

  • 귀속의 2 - 루트 병합 정렬
  • 평균 시간 복잡도: O(nlogn)
  • 알고리즘 사상, 그림:

  • 의 귀속 실현은 매우 간단하고 게시물이 어느 정도 나온 것은 이 순서 주제의 완전성을 확보하기 위해서일 뿐이니 찍지 마세요
  • 직접 코드:
  • public class MergeSort {
        
        /*
         *  Merge these two parts : 
         *      "fromIndex --> splitPoint"
         *      "splitPoint + 1 --> toIndex"
         */
        private static void merge(int[] array, int fromIndex, int splitPoint, int toIndex) {
            
            int[] tempArray = new int[toIndex - fromIndex + 1];
            
            int index = 0;
            
            int i = fromIndex;
            int j = splitPoint + 1;
            
            while (i <= splitPoint && j <= toIndex) {
                if (array[i] < array[j]) {
                    tempArray[index ++] = array[i ++];
                } else if (array[i] == array[j]) {
                    tempArray[index ++] = array[i ++];
                    tempArray[index ++] = array[j ++];
                } else {
                    tempArray[index ++] = array[j ++];
                }
            }
            
            while (i <= splitPoint) {
                tempArray[index ++] = array[i ++];
            }
            
            while (j <= toIndex) {
                tempArray[index ++] = array[j ++];
            }
            
            for (int k = fromIndex, m = 0; k <= toIndex; k ++) {
                array[k] = tempArray[m ++];
            }
            
        }
        
        public static void mergeSort(int[] array, int fromIndex, int toIndex) {
            
            int splitPoint = fromIndex + (toIndex - fromIndex) / 2;
            
            if (fromIndex == toIndex) {
                return;
            }
            
            mergeSort(array, fromIndex, splitPoint);
            mergeSort(array, splitPoint + 1, toIndex);
            
            merge(array, fromIndex, splitPoint, toIndex);
        }
    
    }

  • 좋은 웹페이지 즐겨찾기