데이터 정렬이 가장 빠른 사람은 누구입니까(Array.prototype.sort PK 퀵 정렬 in javascript)_javascript 기술
- WBOY원래의
- 2016-05-16 19:21:101083검색
그런데 저를 놀라게 한 것은 아래 네티즌이 JavaScript에서 Array의 정렬 방법 자체가 가장 빠르고, 퀵 정렬 알고리즘보다 빠르다는 답변을 했다는 것입니다. 작업하는 데 시간이 너무 오래 걸려서 매우 우울했습니다. 오랫동안 정렬 알고리즘에 대해 연구하다가 실제로 Array 자체의 정렬 방법을 잊어버렸습니다
그런데 자바스크립트에 내장된 정렬 방법이 정말 빠른 정렬 알고리즘보다 빠를까요?
하하, 테스트해보면 알 수 있습니다
먼저 테스트 환경에 대해 말씀드리겠습니다
1. 제 테스트 환경은 IE6.0과 firefox2.0입니다
2. 알고리즘마다 차이가 많습니다. 구현 방법. 다음 테스트에서는 위 네티즌이 구현한 퀵 정렬 알고리즘을 선택하고, 내장된 기능만 외부로 옮겼습니다.
3. 알고리즘의 실행 속도는 데이터의 종류, 크기, 양에 따라 다릅니다. I 여기서는 999999보다 작은 정수의 정렬만 비교하며, 데이터 양은 각각 500, 2000, 30000으로 설정됩니다.
정렬 방법 정보: 정렬 방법은 Array에 내장된 방법입니다. javascript에 대한 권위 있는 가이드는 다음과 같이 정의됩니다.
sort( ) 메서드는 배열의 요소를 제자리에 정렬합니다. sort( )가 인수 없이 호출되면 배열의 요소가 만들어지지 않습니다. 배열은 알파벳 순서(보다 정확하게는 문자 인코딩에 따라 결정됨)로 정렬됩니다. 이를 위해 필요한 경우 요소를 먼저 문자열로 변환하여 비교할 수 있습니다. 다른 순서로 요소를 배열하는 경우 두 값을 비교하고 상대적 순서를 나타내는 숫자를 반환하는 비교 함수를 제공해야 합니다. 비교 함수는 두 개의 인수 a와 b를 사용하고 다음 중 하나를 반환해야 합니다.
정렬 방법은 함수 유형 매개변수를 허용할 수 있습니다. 매개변수가 제공되지 않으면 기본값은 문자 순서로 정렬되는 것이므로 정수를 정렬하려면 함수 유형 매개변수를 제공해야 합니다. 이 테스트의 호출 방법은 다음과 같습니다.
array.sort(function (a,b){return a-b})
물론 정렬할 정수의 개수가 매개변수를 제공하지 않고 반환된 결과는 테스트 후에 알 수 있습니다.
코드 복사
코드는 다음과 같습니다. : <script> </span>alert( [3,4,5,11,1].sort()) </div>alert([3,4,5,11,1 ].sort(function(a,b){return a-b})) <div class="codebody" id="code37955"></script>
프롬프트: 먼저 수정한 후 실행하면 됩니다.
결과는 [1, 11, 3, 4, 5] 이는 분명히 우리가 원하는 결과가 아닙니다.
는 정렬이 필요한 배열을 생성합니다. 공정한 결과를 얻기 위해 먼저 정렬에 사용되는 배열을 생성합니다. 두 방법에서 사용되는 배열은 각 비교에서 동일한 요소를 갖습니다. 아래는 무작위 배열을 생성하는 코드입니다
코드 복사
var i=Math.random()
return Math.round((n-m)*i m);
}
function getRandomArr(m,n,l){
//m: 임의의 정수 n의 최소값을 생성합니다. 생성된 임의 정수의 최대값, l: 생성된 배열의 길이
var resultArr=[]
for(var i=0;iresultArr.push(random (m,n))
}
return resultArr;
}
빠른 정렬 알고리즘 구현, 이 알고리즘은 51js 포럼의 네티즌 구현에서 가져왔습니다. 봤는데, 코드는 다음과 같습니다.
코드 복사
if(s
{
var pos=partition(a,s,e)
doSort(a,s, pos-1);
doSort(a,pos 1,e);
}
}
function partition(a,st,en)
{
var s=st;
var e=en 1 ;
var temp=a[s];
while(1)
{
while(a[ s] 임시)
if(s>e)break
var tem=a[s]
a [e]=tem;
}
a[st]=a[e];
a[e]=temp
return e; .prototype.quickSort=function() {
doSort(this,0,this.length-1);
}
array.join()을 사용하여 결과가 올바른지 확인하세요. . 성능 테스트 코드는 다음과 같습니다.
코드 복사
코드는 다음과 같습니다.
function sortIntF(a,b){return a-b}
function pk(num){
//num: 정렬에 사용되는 배열 요소 수
//생성 정렬된 배열
var arr=getRandomArr(1,999999,num);
//요소 개수가 10000개 미만인 경우 n번 실행하여 평균값을 구합니다.
var n=Math.ceil( 10000/num );
//정렬을 위한 여러 개의 배열 복사본 생성
varquickSortArrs=[];
var sortArrs=[]
for(var i=0;iquickSortArrs.push(arr.slice(0));
sortArrs.push(arr.slice(0))
}
var t1=new Date(); > for(var i=0;iquickSortArrs[i].quickSort()
}
var t2=new Date()
for(var i= 0 ;isortArrs[i].sort(sortIntF);
}
var t3=new Date()
alert("성능 비교, " num " 요소 배열의 경우 정렬당 평균 소요 시간은 다음과 같습니다. n"
"Array.prototype.sort:" ((t3-t2)/n) "msn"
"quickSort:" (( t2-t1) /n) "msn"
);
alert("정렬 결과가 정확합니까:" (sortArrs[0].join()==quickSortArrs[0].join()));
}
pk 함수를 직접 호출하면 됩니다. 예를 들어 300개 요소 배열의 정렬 성능을 비교하려면 pk(300)
을 호출하면 됩니다. 전체 테스트 코드는 다음과 같습니다.
테스트 결과
아니요. 처음 한 번(ms)
500개 요소: ie6.0: 정렬: 38.3 39.05 39.05
quickSort: 8.6 8.6 9.4
ff2.0: 정렬: 3.1 3.15 3.9
QuickSort: 4.7 4.7 3.15
2000개 요소: ie6.0: 정렬: 200 203.2 203
quickSort: 40.6 43.6 43.8
ff2.0: 정렬: 18.8 18.6 18.8
quickSor 티: 18.6 15.6 15.6
30000개 요소: ie6.0: 정렬: 10360 9765 9203
quickSort: 843 813 891
ff2.0: 정렬: 422 422 406
quickSort: 328 297 4 07 🎜 >결과에서 볼 수 있듯이
IE6.0에서는 퀵 정렬 알고리즘이 Array 객체의 정렬 방법보다 훨씬 빠르며, 상대적으로 적은 수의 요소에 대해 퀵 정렬 속도는 기본적으로 5배 정도 빠릅니다. 30,000개의 요소에 대해 퀵 정렬은 정렬 방법보다 10배 이상 빠릅니다.
ff2.0에서는 두 정렬 알고리즘의 속도가 기본적으로 동일하며 퀵 정렬 알고리즘이 약간 더 빠릅니다. 또한 ff2.0의 배열 객체 정렬이 여전히 동일하다는 것을 보여줍니다. 빠른 정렬 알고리즘의 데이터에 매우 가깝기 때문에 빠른 정렬을 사용하는 것이 더 효율적일 수 있습니다.
참고: 위의 테스트만 해당됩니다. 내 로컬 컴퓨터의 테스트 결과를 나타냅니다. 차이점은 모두가 테스트하는 데 도움이 되기를 바랍니다.