分割征服


分割征服は複雑で困難な問題をそんなに複雑で容易な問題に分解する方法である.
大量のデータをソートする場合は、分割ソートを使用します.1つの方法は、大量のデータを小さなデータに分割し、2つのデータを比較し、順次組み合わせることです.
JavaScriptを使用した分割ソートのコードは次のとおりです.
//병합정렬을 재귀함수로 구현합니다. 그 이유는 임의의 크기의 병합정렬을 리스트의 크기가 1이 될때까지 반으로 쪼개고 오름차순으로 병합을 할 것이기 때문입니다.
//탈출조건 : array의 길이가 1일 때 해당 array를 리턴합니다.
//else : 분할된 array들에 대하여 오름차순으로 병합한 array를 리턴합니다.
function mergeSort(array) {
    if(array.length===1){
        return array;
    }
    let leftArray=array.slice(0,parseInt(array.length/2));
    let rightArray=array.slice(parseInt(array.length/2));
    return merge(mergeSort(leftArray),mergeSort(rightArray));
}

// merge함수는 반복방법에서의 리스트 병합 예시 코드를 이용했습니다.
function merge(sea, fresh){
	const result = [];
    
    while(!(sea.length===0&&fresh.length===0)){
    	
        if(sea.length===0||fresh.length===0){
        	if(sea.length===0){
            	result.push(fresh[0]);
                fresh.shift();
            }else{
            	result.push(sea[0]);
                sea.shift();
            }
		}else{
        	if(sea[0]<=fresh[0]){
        		result.push(sea[0]);
            	sea.shift();
        	}else{
        		result.push(fresh[0]);
            	fresh.shift();
        	}
        }
	}
    return result;
}
上記の分割ソートは、時間複雑度がlognの分割ペアを半分に分けるプロセスであり、各分割に対するマージプロセスはn、総時間複雑度はnlognであり、ソートを選択する時間複雑度n^2よりも有効である.
参考資料
1.コンピューター科学の路線図を描いた。著者:ブレストン・ペヘラ・ピル:朴妍欧92 P-98 P
2.連結関数