Exercises

기초: Merge Sort

sysout.초코우유 2018. 4. 23. 17:32

도서관 관리 프로그램에서 필요한 기능을 구현하는 것 보다 기능 자체를 떠올리는 데 시간을 더 쓰면서

실제로 기능을 구현하는 데는 시간을 거의 쓰지 못하고 있었다.

그러던 차에 그냥 연습문제를 풀어보는 것이 나을 것 같아서 기본적인 Sorting프로그램을 하나 짜 보았다.


연달아, 며칠 동안 작성한 예제 한두 개를 더 포스팅하려 한다.


아래는 merge sort의 코드.




public class Sort {
	int[] theList;
	
	public Sort(int[] inputList) {
		theList=sort(inputList);
	}
	
	public int[] sort(int[] inputList) {
		if(inputList.length<2)
			return inputList;
		else {
			return merge(sort(split(inputList).firstList),sort(split(inputList).secondList));
		}
	}
	
	
	class ListTuple{
		int[] firstList;
		int[] secondList;
		
		public ListTuple(int[] list1, int[] list2) {
			firstList=list1;
			secondList=list2;
		}
	}
	
	public ListTuple split(int[] list) {
		int lengthOfInput=list.length;
		int i=0; //counter
		int[] list1=new int[lengthOfInput/2], list2=new int[lengthOfInput-lengthOfInput/2];
		for(int temp:list) {
			if(i<(int)(lengthOfInput/2))
				list1[i]=temp;
			else
				list2[i-lengthOfInput/2]=temp;
			i++;
		}
		return new ListTuple(list1, list2);
	}
	
	public int[] merge(int[] list1, int[] list2) {
		int length=list1.length+list2.length;
		int[] result=new int[length];
		for(int i=0, j=0;i+j<length;){
			if(i==list1.length) {
				for(;j<list2.length;){
					result[i+j]=list2[j];
					j++;
				}
				break;
			}
			if(j==list2.length) {
				for(;i<list1.length;) {
					result[i+j]=list1[i];
					i++;
				}
				break;
			}
			
			if(list1[i]<list2[j]) {
				result[i+j]=list1[i];
				i++;
			}
			else {
				result[i+j]=list2[j];
				j++;
			}
		}
		return result;
	}
	
	public int[] merge(ListTuple tuple) {
		return merge(tuple.firstList,tuple.secondList);
	}
	
	public static void main(String[] args) {
		int length=100;
		int[] unSortedList=new int[length];
		int i=0;
		
		System.out.println("정렬 전 리스트");
		for(i=0;i<length;i++) {
			unSortedList[i]=(int)(100*Math.random());
			System.out.printf("%d ", unSortedList[i]);
		}
		System.out.println(" ");
		
		int[] sortedList=new Sort(unSortedList).theList;
		
		System.out.println("정렬 후 리스트");
		for(i=0;i<length;i++)
			System.out.printf("%d ",sortedList[i]);
	}

}