手撕排序

/* 手撕排序 + 算法总结 */
//比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。
//非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。

// 1.冒泡排序
//时间复杂度O(n^2) 最好情况O(n),空间O(1) 稳定
//它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。
//走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
var num = [1,2,4,3,5,6,8,7,9]
var bubbleSort = function(num){
    var temp=0;
    var i=num.length;
    while(i--){
        for(let j=0;j<i-1;j++){
            if(num[j]>num[j+1]){
                temp = num[j+1];
                num[j+1]=num[j];
                num[j]=temp;
            }
        }
    }
    return num;
}
var a=bubbleSort(num);
console.log(a);

// 2.选择排序
//时间复杂度O(n^2) 最好情况O(n^2),空间O(1) 不稳定
//首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;
//然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
var selectionSort = function(num){
    for(let i=0;i<num.length;i++){
        let temp=0;
        for(let j=i+1;j<num.length;j++){
            if(num[i]>num[j]){
                temp=num[j];
                num[j]=num[i];
                num[i]=temp;
            }
        }
    }
    return num;
}
var b=selectionSort(num);
console.log(b);

// 3.插入排序
//时间复杂度O(n^2) 最好情况O(n),空间O(1) 稳定
//通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
var insertionSort = function(num){
    var temp=0;
    for(let i=0;i<num.length;i++){
        for(let j=i;j>0;j--){
            temp = num[j];
            if(num[j]<num[j-1]) num[j] = num[j-1];
            else{
                num[j]=temp;
                break;
            }
        }   
    }
    return num;
}
var c=insertionSort(num);
console.log(c)

// 4.归并排序
//该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
//将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
function mergeSort(arr) {
    var len = arr.length;
    if (len < 2) {
        return arr;
    }
    var middle = Math.floor(len / 2),
        left = arr.slice(0, middle),
        right = arr.slice(middle);
    return merge(mergeSort(left), mergeSort(right));
}
 
function merge(left, right) {
    var result = [];
 
    while (left.length>0 && right.length>0) {
        if (left[0] <= right[0]) {
            result.push(left.shift());
        } else {
            result.push(right.shift());
        }
    }
 
    while (left.length)
        result.push(left.shift());
 
    while (right.length)
        result.push(right.shift());
 
    return result;
}
var d=mergeSort(num);
console.log(d);

// 5.快速排序
//通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,
//则可分别对这两部分记录继续进行排序,以达到整个序列有序。
//steps
//从数列中挑出一个元素,称为 “基准”(pivot);
//重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
//递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
var quickSort = function(nums){
    var len = nums.length;
    if(len<2) return nums;
    var pivot = nums[Math.floor(len/2)];
    var left = 0,right = nums.length-1;
    var temp = 0;
    while(left!=right){
        if(nums[left]<pivot) left++;
        if(nums[right]>pivot) right--;
        temp = nums[right];
        nums[right] = nums[left];
        nums[left] = temp;
    }
    quickSort(nums.slice(0,left));
    quickSort(nums.slice(right,len));
    return nums;
}

var e=quickSort(num);
console.log(e);


全部评论

相关推荐

03-02 19:46
门头沟学院 Java
急急急急急!以下为岗位jd职位名称:&nbsp;测试开发工程师-实习生(网约车核心业务)工作职责:深度质量保障:&nbsp;独立负责滴滴网约车核心链路测试工作,主导测试策略制定、测试方案设计与执行,确保项目高质量上线。效能平台/工具建设:&nbsp;针对复杂的测试场景,主动识别效率瓶颈,设计并开发测试工具、框架或平台(如自动化测试平台、流量回放工具、精准测试系统等),提升研发测试整体效能。自动化体系构建:&nbsp;负责构建和维护模块级、系统级的自动化测试用例,并推动在CI/CD流水线中落地,持续提升项目的自动化覆盖率和测试效率。前沿测试技术探索:&nbsp;深入探索并实践业界先进的测试方案(如智能化测试、混沌工程、立体化监控等),为业务提供更可靠、更高效的质量保障。任职要求:2027年及以后毕业的在校本科生或研究生,可保证每周实习不少于4天,能连续实习3个月以上者优先。熟悉Python/Golang/C++等至少一门编程语言,具备良好的编码能力,有实际项目开发经验者优先。具备强烈的责任心和&nbsp;owner意识,逻辑清晰,具备优秀的问题分析和解决能力。(加分项)对软件测试有浓厚兴趣,了解自动化测试、性能测试或测试工具开发者优先。我们提供:核心业务:&nbsp;深度参与千万级用户产品的研发,技术挑战与成长空间巨大。优秀团队:&nbsp;扁平化管理,技术氛围浓厚,有导师一对一指导。有竞争力福利:&nbsp;餐补、交通补贴、团队团建等。联系方式:jiyelin@didiglobal.com&nbsp;/&nbsp;huyuhan@didiglobal.com
点赞 评论 收藏
分享
03-17 17:38
测试工程师
📍面试公司:字节跳动🕐面试时间:3.17&nbsp;&nbsp;15:00~15:45💻面试岗位:测试开发实习生(Tiktok方向)❓面试问题:1、自我介绍2、为什么要做这个项目(做了个django&nbsp;web),讲一讲这个项目的构造、模块就没了(居然没问遇到的问题什么的)3、对测试工具和框架有什么了解(自我介绍提了一嘴pytest和requests他就问了),有没有使用过,干了什么4、你写了会cicd,讲一下它吧,在ci过程中和cd过程中涉及的测试方面有什么应用(我没搞懂这是回答什么就随便说了点用各种黑盒测试方法的使用,再扯了点cicd的理论,然后他问了一些单元测试、集成测试在cicd的应用我才知道这是在问什么,才把我拉回这道题,不然我还在乱扯)5、进程线程区别6、堆和栈,堆有什么缺点(缺点我不晓得直接说了不知道)7、问了个四个字母的东西是什么(我记不得了哪四个字母了,这玩意听都没听过)8、tcp三次握手9、开放性问题,一个电脑在上线卖之前要测试哪些10、一道代码题,找出一串字符串中出现最多的字母及次数(非常简单就用字典完事了,结果在那个飞书的环境里面运行怎么都报错,面试官看了看也没看出来,让我调试一下调用一下自己传值什么的结果还是不行,面试结束我在pycharm里面再写一遍直接成功,我真无语了,被这个害死就废了。11、反问我问有什么不足,他说算法欠缺(我从没刷过算法啊,这玩意一般人平时写点代码也没用到过啊)12、可能还有问了别的小问题我搞忘了,应该不重要🙌面试感想:无语,废了,难受
查看10道真题和解析
点赞 评论 收藏
分享
评论
2
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务