首页 > 编程语言 >部分排序算法总结

部分排序算法总结

时间:2023-04-26 23:34:55浏览次数:56  
标签:总结 数列 nums 复杂度 length gap 算法 排序

1.冒泡排序

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端

思路:
将相邻的元素进行比较,如果n - 1 > n 交换位置,对每对元素进行同样的工作,完成时最大的数会在最后,然后将进行比较的数组长度缩小 i,重复之前的步骤。可以立flag,当某次没有进行交换时,立刻返回。

时间复杂度为O(n^2)

动图演示:

img

nums = [1,2,14,23,15,11,13,36,24,26]
for(i = 0;i < nums.length;i++){
    let flag = true
    for(j = 1;j < nums.length - i;j++){
        if(nums[j - 1] > nums[j]){
            //解构赋值
            [nums[j - 1],nums[j]] = [nums[j],nums[j - 1]]
            flag = false
        }
    }
    if(flag){
        break
    }
}
console.log(nums)

2.选择排序

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能是不占用额外的内存空间

思路:
假设第一个数为最小值min,与后面的数进行比较若大于便交换,左后将min存放到排序序列的起始位置,再从剩余的未排序元素中寻找最小元素添加到已排序序列的末尾,重复直到完成,时间复杂度为O(n^2)

动图演示:
img

nums = [1,2,14,23,15,11,13,36,24,26]
for(i = 0;i < nums.length - 1;i++){
    let minindex = i
    for(j = i + 1;j < nums.length;j++){
        if(nums[j] < nums[i]){
            minindex = j
        }
    }
    [nums[i],nums[j]] = [nums[j],nums[i]]
}
console.log(nums)

3.插入排序

思路:假设第一个值已经是排好序的,所以从头开始到假设的值为止进行排序,每次都用新的值与前面排好的值对比,小于交换大于结束内循环,直到外循环结束

时间复杂度为O(n^2)

动图演示:
img

nums = [1,2,14,23,15,11,13,36,24,26]
for(i = 1;i < nums.length;i++){
    for(j = i;j >= 0;j--){
        if(nums[j] < nums[j - 1]){
            [nums[j],nums[j - 1]] = [nums[j - 1],nums[j]]
        }else{
            break
        }
    }
}
console.log(nums)
//二分插入
//思路:在已排序序列中找插入位置时采用二分查找
for(i = 1;i < nums.length;i++){
    let key = nums[i]
    let left = 0
    let right = i - 1
    while(left <= right){
        let mid = Math.floor(left + (right -left) / 2)
        if(nums[mid] > nums[i]){
            right = mid - 1
        }else{
            left = mid + 1
        }
    }
    for(j = i - 1;j >= left;j--){
        nums[j + 1] = nums[j]
    }
    nums[left] = key
}

4.归并排序

取数组中间的值,遍历数组与其比较,小的放左边,大的放右边,进行递归,直到数组长度为一再回溯拼接

平均时间复杂度为O(nlogn),最坏为O(n^2),空间复杂度为O(logn)

动图演示:
这里写图片描述

图片示意:
img
在这里插入图片描述


5.快速排序

取数组中的某个值,遍历数组与其比较,小的放左边,大的放右边,进行递归,直到数组长度为一再回溯拼接

平均时间复杂度为O(nlogn),最坏为O(n^2),空间复杂度为O(logn)

算法步骤:

  1. 从数列中挑出一个元素,称为 "基准"(pivot);
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序

动图演示:
img

nums = [1,2,14,23,15,11,13,36,24,26]
var sort = function(nums){
    if(nums.length <= 1){
        return nums
    }
    let basis = nums.splice(0,1)
    let left = []
    let right = []
    for(i = 0;i < nums.length;i++){
        if(basis[0] > nums[i]){
            left.push(nums[i])
        }else{
            right.push(nums[i])
        }
    }
    return sort(left).concat(basis,sort(right))
}
console.log(sort(nums))

6.希尔排序

希尔排序,也称递减增量排序算法

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
  • 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位

图片示例:
preview
img

function shellSort(nums) {
    var len = nums.length,
        temp,
        gap = 1;
    while(gap < len / 3) {          //动态定义间隔序列
        gap =gap * 3 + 1;
    }
    for (gap; gap > 0; gap = Math.floor(gap/3)) {
        for (var i = gap; i < len; i++) {
            temp = nums[i];
            for (var j = i-gap; j >= 0 && nums[j] > temp; j-=gap) {
                nums[j+gap] = arr[j];
            }
            nums[j+gap] = temp;
        }
    }
    return nums;
}
nums = [1,2,14,23,15,11,13,36,24,26]
shellSort(nums)

标签:总结,数列,nums,复杂度,length,gap,算法,排序
From: https://www.cnblogs.com/shallow-dreamer/p/17357723.html

相关文章

  • 基于肤色空间建模+连通域处理的人脸检测算法的MATLAB仿真
    1.算法仿真效果matlab2022a仿真结果如下:   2.算法涉及理论知识概要        在过去的几年里,人脸识别受到了广泛的关注,被认为是图像分析领域最有前途的应用之一。人脸检测可以考虑人脸识别操作的很大一部分。根据其强度将计算资源集中在持有人脸的图像部分。图片......
  • m十字路口多功能控制交通系统,包括基于遗传算法优化的红绿灯时长模糊控制器和基于BP神
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要单十字路口:其中第一级控制为两个并行模块:绿灯交通强度控制模块与红灯交通强度控制模块。绿灯交通强度控制模块的输入为绿灯相位的排队长度与入口流量,输出绿灯相位的交通强度;红灯相位模块的输入为红灯相位的......
  • 基于肤色空间建模+连通域处理的人脸检测算法的MATLAB仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要在过去的几年里,人脸识别受到了广泛的关注,被认为是图像分析领域最有前途的应用之一。人脸检测可以考虑人脸识别操作的很大一部分。根据其强度将计算资源集中在持有人脸的图像部分。图片中的人脸检测方法很复杂,因为......
  • m基于背景差法与GMM混合高斯模型结合的红外目标检测与跟踪算法matlab仿真
    1.算法仿真效果matlab2013b仿真结果如下: 普通视频:  红外视频:   2.算法涉及理论知识概要       在Stauffer等人提出的自适应混合高斯背景模型基础上,为每个像素构建混合高斯背景模型,通过融入帧间差分把每帧中的图像区分为背景区域、背景显露区域和运动物......
  • 2023.4.26三天学习总结
    一.三天任务完成情况1.完成了tarjan求强连通分量以及在缩点后的DAG上dp的复习2.完成了tarjan求点双和边双以及在缩点后数方案数的复习3.简单制定了一下接下来一年的学习计划4.完成了div3的补题二.截图 三.题解CodeforcesRound867(Div.3)......
  • m基于背景差法与GMM混合高斯模型结合的红外目标检测与跟踪算法matlab仿真
    1.算法仿真效果matlab2013b仿真结果如下:普通视频:红外视频:2.算法涉及理论知识概要在Stauffer等人提出的自适应混合高斯背景模型基础上,为每个像素构建混合高斯背景模型,通过融入帧间差分把每帧中的图像区分为背景区域、背景显露区域和运动物体区域。相对于背景区域,背景显露......
  • 8冒泡排序
    #include<iostream>usingnamespacestd;#defineN10intmain(){ intarr[N],a,k,i,j,count; cin>>a; for(i=0;i<a;i++){ cin>>arr[i]; } for(i=0;i<a;i++){ for(j=i+1;j<a;j++){ k=arr[j]; if(k<arr[i]){ arr[j]=arr[i]; arr[i]=......
  • 今日总结
    今天完成了安卓app发送短信  ......
  • 从原理聊 JVM(一):染色标记和垃圾回收算法
    1JVM运行时内存划分1.1运行时数据区域• 方法区属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池,属于方法区的一部分,用于存放编译期生成的各种字面量和符号引用。JDK1.8之前,Hotspot虚拟机对方法区的实现叫做永久代,1......
  • 4.26每日总结
    今天做了什么:掌握了从(接口返回的)json中获取(智能裁剪后的)图片二进制数据并存储到数据库,从数据库调出图片并用JFrame显示遇到了哪些困难:二进制数据和String数据之间转换,常量String不能过长明天打算做什么:继续学习web,尝试将图片显示在dialog中......