[etc] 최댓값,최솟값, 정렬
최댓값, 최솟값
sort -> 안됨
let a = [ 10 , 20 , 30 , 1 ,2, 3, 5, 9, 11];
a.sort()
console.log( `Min : ${a[0]}`)
console.log( `Min : ${a[a.length-1]}`)
console.log("sort해서 맨앞 값, 맨 뒷값은 작동 안함.")
Math.max
console.log( `Math.max ${Math.max(10,20)}` )
console.log( `Math.max ${Math.max(a)} 배열은 작동 안함` )
Math.max.apply
console.log( `Math.max.apply ${Math.max.apply(null, a)}` )
console.log( `Math.min.apply ${Math.min.apply(null, a)}` )
for
let m=0;
for( var i of a ){
if( i > m) m=i;
};
console.log(`for ${m}`);
Reduce
result1 = a.reduce(function(a,b){
return a>b? a:b
});
console.log( `max : ${result1}` )
result2 = a.reduce(function(a,b){
return a<b? a:b
});
console.log( `min : ${result2}` )
정렬
선택정렬
let a = [10,11,9,2,3,6,5,4];
let result = [];
while(true){
min = Math.min.apply(null,a);
result.push( min )
a.splice(a.indexOf(min) ,1)
if( a.length == 0 ) break;
};
console.log( result)
삽입정렬
function findIndex( result , a ){
for( var i in result ){
if( a < result[i]){
return i;
};
}
return result.length;
}
let a= [5,10,66,77,54,32,11,15];
let result = [];
let arrLength = a.length;
for( var i=0; i<arrLength ; i++){
insertValue = a.shift();
index = findIndex( result , insertValue );
result.splice( index , 0 , insertValue );
console.log( `인덱스 : ${index}`)
console.log(`정렬된 배열 : ${result}`)
};
console.log( result )
병합정렬
// 어떤 정렬보다 빠름
let a = [5,10,66,77,54,32,11,15];
/*
분할
[5,10,66,77,54,32,11,15]
[5,10,66,77], [54,32,11,15]
[5,10],[66,77], [54,32],[11,15]
[5],[10],[66],[77], [54],[32],[11],[15]
정복
[5,10] , [66,77] , [32,54] , [11,15] -이제 0번째만 비교
[ 5 , 10 , 66 , 77 ] , [11,15,32,54]
[5,10,11,15,32,54,66,77]
*/
function 병합정렬(입력배열){
let 입력배열의길이 = 입력배열.length;
let 결과값 = [];
if( 입력배열의길이 <= 1) return 입력배열;
let 중간값 = parseInt(입력배열의길이/2);
let 그룹하나 = 병합정렬( 입력배열.slice(0,중간값) );
let 그룹둘 = 병합정렬( 입력배열.slice(중간값) );
while(그룹하나.length!=0 && 그룹둘.length!=0){
if( 그룹하나[0] < 그룹둘[0]){
결과값.push( 그룹하나.shift() )
}else{
결과값.push( 그룹둘.shift() )
};
};
while(그룹하나.length != 0 ){
결과값.push( 그룹하나.shift() )
};
while(그룹둘.length != 0 ){
결과값.push( 그룹둘.shift() )
};
return 결과값
}
console.log( 병합정렬(a) )
퀵정렬
/*
worst - O(nLog2n)
best - O(n**n)
*/
let 입력값 = [66,77,54,32,10,5,11,15];
/*
[66,77,54,32,10,5,11,15]
피봇값 : 66
[54,32,10,5,11,15] + [66] + [77]
피봇값 : 54
[32,10,5,11,15] + [54]+ [66] + [77]
피봇값 : 32
[10,5,11,15] +[32] [54]+ [66] + [77]
피봇값 : 10
[5]+[10]+[11]+[15] +[32] [54]+ [66] + [77]
*/
function 퀵정렬(입력배열){
let 입력배열의길이=입력배열.length;
if( 입력배열의길이 <= 1){
return 입력배열
};
let 피벗값 = [입력배열.shift()];
let 그룹하나 = [];
let 그룹둘 = [];
for( var i in 입력배열){
if( 입력배열[i] < 피벗값){
그룹하나.push( 입력배열[i] )
}else{
그룹둘.push( 입력배열[i] )
}
}
console.log( `그룹하나: ${그룹하나}\n 그룹둘: ${그룹둘} \n 피벗값:${피벗값}`)
return 퀵정렬(그룹하나).concat(피벗값,퀵정렬(그룹둘))
}
console.log( 퀵정렬( 입력값 ) )