Please enable Javascript to view the contents

经典排序算法

 ·  ☕ 2 分钟  ·  🙀 Moya

冒泡排序

算法思想:

从数列第一个元素R1开始,与邻近元素R2进行比较,若R1>R2,则交换;同理,依次比较R2R3R4R5…,经过一趟比较,最大的数被交换到数列尾端。从数列第一个元素到数列倒数第二个元素,用内层循环表示。
对除上述父数列的尾端元素的子数列重复上述操作。子数列尾端下标不断减小,用外层循环表示。

JavaScript代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function bubbleSort(nums){
    for(var end=nums.length-1; end>0;end--){
        for(var i=0; i<end;i++){
            if(nums[i]>nums[i+1]){
                [nums[i],nums[i+1]]=[nums[i+1],nums[i]];
            }
        }
    }
    return nums;
}

选择排序

算法思想:

在数列第一个元素依次开始遍历,找出最大的元素,与数列尾端元素交换。遍历元素,内层循环。
对除上述父元素尾端元素的子数列,重复上述操作。尾端下表依次减小,外层循环。

JavaScript代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
function selectSort(nums){
    for(var end=nums.length-1; end>0;end--){
        var maxPos=0;
        //这里注意要有等号 因为数列的最大值有可能本来就在尾端位置
        for(var i=0;i<=end;i++){
            if(nums[i]>nums[maxPos]){
                maxPos=i;
            }
        }
        [nums[maxPos],nums[end]]=[nums[end],nums[maxPos]];
    }
}

直接插入排序

算法思想:

从最小有序子数列出发,依次将最小子数列邻近的数字插入该有序子数列中。

元素个数只有1的数列出发,若该数列邻近元素小于该数列尾端元素,则依次从尾端元素往前查找合适的插入位置并插入。从尾端元素起向前遍历,内层循环。
将该子数列长度加1,重复上述操作。尾端下标依次向后移动一位,外层循环。

JavaScript代码实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
function insertionSort(nums){
    for(var end=1;end<nums.length;end++){
        if(nums[end]<nums[end-1]){
            var temp=nums[end];
            var j;
            for(j=end-1;j>=0 && nums[j]>temp; j--){
                nums[j+1]=nums[j];
            }
            nums[j]=temp;
        }
    }
    return nums;
}

希尔排序

希尔排序是第一个突破算法复杂度O(n2)的算法,是直接插入排序的升级版。希尔排序是将固定间隔为某interval的元素看作一组数列,对该数列进行直接插入排序。

算法思想:

JavaScript代码实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
function shellSort(nums){
    var interval=Math.floor(nums.length/2)
    for(;interval>0;interval=Math.floor(interval/2)){
        for(var end=interval; end<nums.length; end++){
        if(nums[end]<nums[end-interval]){
            var temp=nums[end];
            var j;
            for(j=end-interval;j>=0&&nums[j]>temp;j-=interval){
                nums[j+interval]=nums[j];
            }
            nums[j]=temp;
        }
    	}
    }
    
    return nums;
}

快速排序

算法思想:

找一个基准数字,通过一趟排序,该基准数字的左边都比该数字小,右边都比该数字大。


2020/12/1注:

本文在迁移前,本来涉及LaTex数学公式。我尝试了很久想要使用Katex支持Latex,但是最终还是无法正确地使用$渲染LaTex。

分享

Moya Huang
作者
Moya
Student, Front-End Newbie