前端排序算法

一. 冒泡排序

1.原理:比较两个相邻的元素,将大的交换到右边,如果相等,则不进行交换;

2.过程:

(1)第一次比较:比较第一个数和第二个数,将值大的放在前面,值小的放在后面;

(2)比较第二个数和第三个数,依次类推...;

(3)第一次比较完成,最大的数放到了最后面;

(4)进行第二次比较,最后一个数不参加比较,依次类推进行第三次比较...;

3. 时间复杂度:N个数字要完成排序,要进行总共N-1次排序,每次(第 i 次)排序次数为(N-i)次,用双循环语句,外层控制循环次数,内层控制每一次的循环次数,时间复杂度为O(n^{2});

4.实现代码:

var arr=[10,5,69,80,19,56,50];
for ( var i=1;i<arr.length;i++){
    for (var j=0;j<arr.length;j++) {
        if (arr[j] > arr[j+1]) {
            var temp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = temp;
        }
    }
}
console.log(arr)

二.插入排序算法

1.原理:将未排序数据,对已排序数据序列从后向前对比扫描,找到对应的位置并插入,在从后向前扫描的过程中,需要反复的把已排序的元素逐步向后挪位,为新插入元素提供插入的位置。

2.过程

(1)第一个元素被认为已被排序;
(2)取出下一个元素,在已经排好序的序列中从后往前对比扫描,如果该元素小于序列中对比的元素;将该元素插入到该位置
(3)不断重复步骤2

3.时间复杂度:外层循环将遍历数组,每次循环决定要“插入”的数,内层循环从第二个元素(第一个进行排序的元素)开始,每次与前一个数进行比较,决定是否插入。时间复杂度是O(n^{2});

4.实现代码:

var arr=[10,5,69,80,19,56,50];
for (var i=1; i<arr.length;i++){
    for (var j=i-1;j>=0;j--){
        if (arr[j+1]<arr[j]) {
            var temp=arr[j+1];
            arr[j+1]=arr[j];
            arr[j]=temp;
        }else if(arr[j+1]>=arr[j]) {
            break;
        }
    }
}

三.快速排序算法

1.原理:使用分治法策略来把一个序列分为两个子序列。

2.过程:

(1)以数组中的第一个元素为基准元素

(2)所有比基准小的元素放在low数组里,所有比基准大的放在high数组里,相同的可以放到任意一遍

(3)递归把小于基准值元素的子数列和大于基准值元素的子数列排序

(4)最后把数组拼接到一起

3.时间复杂度:O(nlogn)。

4.实现代码

var arr=[10,5,69,80,19,56,50];
function quickSort(arr){
    if(arr.length<=1) {
        return arr;
    }
    let lowArr=[];
    let highArr=[];
    for(let i=1; i<arr.length; i++) {
        if(arr[i] >= arr[0]) {
            highArr.push(arr[i]);
        }else{
            lowArr.push(arr[i]);
        }
    }
    return quickSort(lowArr).concat(arr[0]).concat(quickSort(highArr));
}

四.希尔排序

1.原理:简单插入排序的改进版,优先比较距离较远的元素,所以又叫缩小增量排序

2.过程:

(1)选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;

(2)按增量序列个数k,对序列进行k 趟排序;

(3)每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

3.时间复杂度:O(nlogn)。

4.实现代码:

var arr=[10,5,69,80,19,56,50];
function shellSort(arr) {
    var len=arr.length;
    var temp;
    var num;
    while (num<len/3) {      //定义间隔序列
        num = num * 3 + 1;
    }
    for (num; num>0; num=Math.floor(num/3)) {
        for (var i=num; i<len; i++) {
            temp = arr[i];
            for (var j=i-num; j>0 && arr[j]>temp; j-=num) {
                arr[j+num] = arr[j];
            }
            arr[j+num] = temp;
        }
    }
    return arr;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值