JS 排序算法整理

关于排序算法的问题可以在网上搜到一大堆,但是纯 JS 版比较零散,之前面试的时候特意整理了一遍,附带排序效率比较。

//1.冒泡排序

var bubbleSort = function(arr) {

    for (var i = 0, len = arr.length; i < len - 1; i++) {
        for (var j = i + 1; j < len; j++) {
            if (arr[i] > arr[j]) {
                var temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }

    return arr;
};

//2.选择排序

var selectSort = function(arr) {

    var min;
    for (var i = 0; i < arr.length - 1; i++) {
        min = i;
        for (var j = i + 1; j < arr.length; j++) {
            if (arr[min] > arr[j]) {
                min = j;
            }
        }
        if (i != min) {
            swap(arr, i, min);
        }
        console.log(i + 1, ": " + arr);
    }
    return arr;
};

function swap(arr, index1, index2) {
    var temp = arr[index1];
    arr[index1] = arr[index2];
    arr[index2] = temp;
};

//3.插入排序

var insertSort = function(arr) {
    var len = arr.length,
        key;
    for (var i = 1; i < len; i++) {
        var j = i;
        key = arr[j];
        while (--j > -1) {
            if (arr[j] > key) {
                arr[j + 1] = arr[j];
            } else {
                break;
            }
        }
        arr[j + 1] = key;
    }
    return arr;
};

//4.希尔排序

function shellSort(arr) {
    if (arr.length < 2) {
        return arr;
    };
    var n = arr.length;
    for (gap = Math.floor(n / 2); gap > 0; gap = Math.floor(gap /= 2)) {
        for (i = gap; i < n; ++i) {
            for (j = i - gap; j >= 0 && arr[j + gap] < arr[j]; j -= gap) {
                temp = arr[j];
                arr[j] = arr[j + gap];
                arr[j + gap] = temp;
            }
        }
    }
    return arr;
};

//5.归并排序

function merge(left, right) {
    var result = [];
    while (left.length > 0 && right.length > 0) {
        if (left[0] < right[0]) {
            // shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值
            result.push(left.shift());
        } else {
            result.push(right.shift());
        }
    }
    return result.concat(left).concat(right);
}

function mergeSort(arr) {
    if (arr.length == 1) {
        return arr;
    }
    var middle = Math.floor(arr.length / 2),
        left = arr.slice(0, middle),
        right = arr.slice(middle);
    return merge(mergeSort(left), mergeSort(right));
}

//6.快速排序

var quickSort = function(arr) {  
    if (arr.length <= 1) {
        return arr;
    }

    var pivotIndex = Math.floor(arr.length / 2); 
    var pivot = arr.splice(pivotIndex, 1)[0];

    var left = [];
    var right = [];  
    for (var 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));

}; 

//算法效率比较

//---------------------------------------------------------------
//| 排序算法 | 平均情况         | 最好情况   | 最坏情况   | 稳定性 |
//---------------------------------------------------------------
//| 冒泡排序 |  O(n²)          |  O(n)     |  O(n²)    | 稳定   |
//---------------------------------------------------------------
//| 选择排序 |  O(n²)          |  O(n²)    |  O(n²)    | 不稳定 |
//---------------------------------------------------------------
//| 插入排序 |  O(n²)          |  O(n)     |  O(n²)    | 稳定   |
//---------------------------------------------------------------
//| 希尔排序 |  O(nlogn)~O(n²) |  O(n^1.5) |  O(n²)    | 不稳定 |
//---------------------------------------------------------------
//| 归并排序 |  O(nlogn)       |  O(nlogn) |  O(nlogn) | 稳定   |
//---------------------------------------------------------------
//| 快速排序 |  O(nlogn)       |  O(nlogn) |  O(n²)    | 不稳定 |
//---------------------------------------------------------------
时间: 2024-10-10 16:06:57

JS 排序算法整理的相关文章

js排序算法

利用js来实现一些常见的排序算法,在面试中问得还是挺多的,下面我就其进行了简单的总结. sort()方法 首先要讲讲JS数组排序的sort方法,它实现的原理是通过两两比较的方法,sort()方法按升序排列数组项,即最小的值位于最前面,最大的值位于最后面,为了实现排序,sort()方法会调用每个数组项的toString()方法,然后比较得到的字符串,即使数组中的每一项都是数值,sort方法比较的也是字符串.因此有必要定义一个比较函数: function compare(value1,value2)

自己写的JS排序算法

这学期刚刚学完数据结构,之前就自己写了一点东西,现在整理一下. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>JS实现排序</title> <meta name

结构-行为-样式-Js排序算法之 直接插入排序

最新因工作原因需要接触到算法,之前学习C++的时候有接触过算法,Javascript中实现算法其实也是大同小异.下面我讲下第一个实现的排序算法--直接插入排序.基本实现思路:假定一个数组中前n(n>=2)个值已经排序好了,那我们就从第n+1个与前面进行比较,当  a[n+1] > a [i] && a[n+1] < a[i-1] 的时候则进行插入,以此类推. var arr = [23,85,61,37,55,12,63,12,99,39,70,21]; function

各种排序算法整理

1.插入排序 void InsertSort(int *a, int n) { for(i = 1; i < n; i++) { k = a[i]; for(j = i; k < a[j-1] && j > 0; j--) a[j] = a[j - 1]; a[j] = k; } } 2.冒泡排序 void BubbleSort(int *a, int n) { for(i = 0; i < n; i++) { for(j = 0; j < n - i; j+

js排序算法总结——冒泡,快速,选择,插入,希尔,归并

相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法. 一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放在前面: 如 var arr = [7, 3, 10, 1, 8, 4, 2, 4, 4, 3] 进行升序排列,排序过程如下 第一次 [3, 7, 1, 8, 4, 2, 4, 4, 3, 10] 第二次 [3, 1, 7, 4, 2, 4, 4, 3, 8, 10] 以此类推 .... 结果 [1

排序算法整理(啊哈算法)

一.桶排序 这是一个非常快的排序算法.桶排序从1956年就开始被使用,该算法的基本思想是由 E.J.Issac 和R.C.Singleton 提出来的.之前我说过,其实这并不是真正的桶排序算法,真正的 桶排序算法要比这个更加复杂. 示例:数组 {5, 3, 5, 2, 8} 进行排序(已知最大数值不会超过 10) 代码如下: 总结:排序很快,但是性能损耗很大,对未知大小的数组无法使用,同时浮点型的排序难度非常大. 二.经典排序冒泡 冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误

JS排序算法总结:八种算法对比

目的:掌握 排序算法的分类及不同算法复杂度的对比.搞清楚 XXX与数组初始状态无关分为几种情况: a.算法复杂度与初始状态无关: b.元素总比较次数与初始状态无关: c.元素总移动次数与初始状态无关. 1.算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间

排序算法整理:冒泡排序、堆排序、插入排序、归并操作、快速排序、希尔排序、选择排序

SortUtils.java package prms.utils.sort; import java.util.Arrays; /** * @ClassName: SortUtils * @Description: <p> 排序算法 工具类 </p> * @author edgar * @email [[email protected]] * @version V 1.0 * @date 2017-3-28 15:35:12 */ public class SortUtils {

js排序算法基础--快速排序

快速排序 快速排序也是最常用的排序算法,和归并算法一样,快速排序也采用分治的方法,将原始数组分为较小的数组.(但是并没有像归并排序那样将它们分开) 思路: 1.从数组中选择中间一项作为主元: 2.创建两个指针,左边一个指向数组的第一项,右边指向数组最后一项.移动左指针直到我们找到一个比主元大的元素,接着,移动右指针直到找到一个比主元小的元素.然后交换它们,重复这个过程,直到左指针超过了右指针.这个过程是的比主元小的值都排在了主元之前,而比主元大的值都排在了主元之后,这一步叫划分操作. 3.接着,