7大排序算法总结 JS 实现

//bubble sort 


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


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
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


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 


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




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


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);


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 快速排序是一种分治算法,通常用于对数组进行排序。它的基本思想是:选择一个基准元素,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 下面是用 JavaScript 实现快速排序的示例代码: ``` function quickSort(arr) { if (arr.length <= 1) { return arr; } const pivotIndex = Math.floor(arr.length / 2); const pivot = arr.splice(pivotIndex, 1)[0]; const left = []; const right = []; for (let i = 0; i < arr.length; i++) { if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } return quickSort(left).concat([pivot], quickSort(right)); } ``` 在这段代码中,我们首先判断数组的长度是否小于等于 1,如果是,则直接返回数组,否则继续执行排序。接下来,我们计算出数组的中间索引,并使用 `splice` 方法将这个元素从数组中取出,作为基准元素。然后我们遍历数组,将比基准元素小的元素放到左边的数组中,将比基准 ### 回答2: 快速排序是一种常用的排序算法,通过分治的思想对数组进行排序。使用JavaScript实现快速排序的步骤如下: 1. 选择一个基准元素(通常选择数组的第一个元素)。 2. 将数组分成两个子数组,小于基准元素的放在左边,大于基准元素的放在右边。 3. 对左右子数组分别进行递归调用快速排序。 4. 合并左右子数组和基准元素,得到排序后的数组。 下面是使用JavaScript实现快速排序的代码: ```javascript function quickSort(arr) { // 结束条件:当数组的长度小于等于1时,无需再进行排序 if (arr.length <= 1) { return arr; } // 选择一个基准元素 const pivot = arr[0]; const left = []; const right = []; // 将数组按照基准元素分成左右两个子数组 for (let i = 1; i < arr.length; i++) { if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } // 对左右子数组进行递归调用快速排序,并合并左子数组、基准元素和右子数组 return quickSort(left).concat(pivot, quickSort(right)); } // 测试代码 const arr = [5, 2, 7, 3, 9, 1]; const sortedArr = quickSort(arr); console.log(sortedArr); ``` 这段代码实现了快速排序算法,首先选择数组的第一个元素作为基准元素,然后将数组按照基准元素的大小分成左右两个子数组,再对左右子数组进行递归调用快速排序,最后合并左子数组、基准元素和右子数组,返回排序后的数组。 ### 回答3: 快速排序是一种常用的排序算法,其基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再对这两部分记录进行排序,最终得到有序序列。 通过JavaScript实现快速排序算法的关键步骤如下: 1. 确定基准值:选取数组中任意一个元素作为基准值,通常选择第一个元素或最后一个元素。此处以选择第一个元素为例。 2. 分割数组:遍历数组,将小于基准值的元素放在左边,大于基准值的元素放在右边,相等的元素可以放在任意一边。 3. 递归排序:将左边和右边的子数组分别进行快速排序,直到每个子数组只含有一个元素。 4. 合并数组:将排好序的左边数组、基准值和排好序的右边数组依次合并起来,即得到最终的排序结果。 下面是一个使用JavaScript实现快速排序算法的示例代码: ```javascript function quickSort(arr) { if (arr.length <= 1) { return arr; } const pivotIndex = Math.floor(arr.length / 2); const pivot = arr.splice(pivotIndex, 1)[0]; const left = []; const right = []; for (let i = 0; i < arr.length; i++) { if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } return quickSort(left).concat([pivot], quickSort(right)); } const array = [5, 3, 1, 2, 4]; const sortedArray = quickSort(array); console.log(sortedArray); // [1, 2, 3, 4, 5] ``` 以上是一个简单的使用JavaScript实现快速排序算法的示例,通过递归调用实现对子数组的排序,最终得到整个数组的排序结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值