8大排序算法总结 JS 实现

本文详细介绍了冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序等基本排序算法的原理及JavaScript实现方式,并通过实例展示了不同排序算法的应用。

//bubble sort 


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function bubbleSort(arr,comp){
 
 
for (var i = 0 ;i < arr.length; i++){
for (var j = 0 ; j < arr.length - i - 1 ; j++){
if (comp(arr[j],arr[j+ 1 ])){
exch(arr,j,j+ 1 );
}
}
}
 
 
}
 
 
function exch(a,i,j){
var tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
 
 
var input = new Array( 5 , 1 , 4 , 2 , 3 );
bubbleSort(input,function(a,b){ return a > b;});
console.log(input);
 
 
input = new Array( 5 , 1 , 4 , 2 , 3 );
bubbleSort(input,function(a,b){ return a < b;});
console.log(input);





//selection sort


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function selectionSort(arr,comp){
 
 
for (var i = 0 ;i < arr.length ; i++){
for (var j = i;j < arr.length ; j++){
if (comp(arr[i],arr[j])) { exch(arr,i,j); }
}
}
 
 
}
 
 
function exch(a,i,j){
var t = a[i];
a[i] = a[j];
a[j] = t;
}
 
 
var input = new Array( 5 , 1 , 4 , 2 , 3 );
selectionSort(input,function(a,b){ return a > b;});
console.log(input);
 
 
input = new Array( 5 , 1 , 4 , 2 , 3 );
bubbleSort(input,function(a,b){ return a < b;});
console.log(input);





//insert sort

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function insertSort(arr,comp){
var result = new Array();
for (;arr.length > 0 ;){
 
 
var inserted = false ;
for (var j = 0 ;j < result.length; j++){
if (comp(result[j],arr[ 0 ])) { insert(result,j,arr[ 0 ]); inserted = true ; break ;}
}
if (!inserted){insert(result,result.length,arr[ 0 ]);}
arr.splice( 0 , 1 );
}
return result;
}
 
 
function insert(arr,i,v){
arr.splice(i, 0 ,v);
}
 
 
var input = new Array( 5 , 1 , 4 , 2 , 3 );
var ret = insertSort(input,function(a,b){ return a > b;});
console.log(ret);
 
 
var input = new Array( 5 , 1 , 4 , 2 , 3 );
ret = insertSort(input,function(a,b){ return a < b;});
console.log(ret);





//shell sort


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function shellSort (a,comp) {
     for (var h = a.length; h = parseInt(h / 2 );) {
         for (var i = h; i < a.length; i++) {
             var k = a[i];
             for (var j = i; j >= h && comp(k, a[j - h]); j -= h)
                 a[j] = a[j - h];
             a[j] = k;
         }
     }
     return a;
}
 
 
var arr = new Array( 7 , 9 , 2 , 5 , 4 , 1 , 3 );
var r = shellSort(arr,function (a,b){ return a > b;});
console.log(r);





//merge sort 


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
function mergeS(arr,comp){
 
 
if (arr.length == 1 ){ return arr;}
 
 
var mid = arr.length / 2 | 0 ;
var leftArr = new Array();
var rightArr = new Array();
for (var i = 0 ;i < mid;i ++){
leftArr.push(arr[i]);
}
 
 
for (var j = mid;j < arr.length; j++){
rightArr.push(arr[j]);
}
 
 
console.log( "before : " + leftArr + " | " + rightArr);
var leftRet = mergeS(leftArr,comp);
var rightRet = mergeS(rightArr,comp);
 
 
var r = merge(leftRet,rightRet,comp);
return r;
}
 
 
function merge(leftArr,rightArr,comp){
 
 
var ret = new Array();
var i = j = 0 ;
for (;i < leftArr.length && j < rightArr.length; ){
if (comp(leftArr[i],rightArr[j])){ret.push(leftArr[i]); i ++}
else {ret.push(rightArr[j]); j ++}
}
 
 
for (;i < leftArr.length;){
ret.push(leftArr[i]);i++;
}
for (;j< rightArr.length; ){
ret.push(rightArr[j]);j++;
}
 
 
return ret;
 
 
}
 
 
var r = mergeS( new Array( 0 , 6 , 5 , 1 , 2 , 4 , 3 , 9 ),function(a,b){ return a > b;});
console.log(r);





//quick sort




?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function quickS(arr,lo,hi,comp){
if (lo >= hi){ return ;}
 
 
var stub = arr[lo];
 
 
var i = lo + 1 ;
var j = hi;
 
 
for (;i < j ;){
for (;i < j && !comp(stub,arr[j]);j--);
for (;i < j && comp(stub,arr[i]);i++);
 
 
if (i >= j){ break ;}
 
 
var t = arr[i];
arr[i] = arr[j];
arr[j] = t;
 
 
j--;
i++;
}
 
 
if (comp(arr[lo],arr[i])){
var t = arr[lo];
arr[lo] = arr[i];
arr[i] = t;
}
 
 
quickS(arr,lo,i- 1 ,comp);
quickS(arr,i,hi,comp);
}
 
 
var input = new Array( 22 , 3 , 10 , 66 , 15 , 11 , 2 , 4 , 31 , 9 );
quickS(input, 0 , input.length - 1 ,function(a,b){ return a > b;});
console.log(input);





//heap sort

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var ret = new Array();
function heapS(arr,comp){
if (arr.length == 0 ){ return ;}
var i = arr.length / 2 | 0 ;
for (;i >= 0 ; i--){
if (comp(arr[i], arr[i * 2 ])){exch(arr, i, i* 2 );}
if (comp(arr[i], arr[i * 2 + 1 ])) {exch(arr, i, i* 2 + 1 );}
}
ret.push(arr[ 0 ]);
arr.splice( 0 , 1 );
heapS(arr,comp);
}
 
 
function exch(arr,i,j){
var t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
 
 
heapS( new Array( 16 , 22 , 91 , 0 , 51 , 44 , 23 ),function (a,b){ return a > b;});
console.log(ret);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值