首页 > 其他分享 >排序

排序

时间:2024-10-23 14:09:46浏览次数:1  
标签:function arr right len 排序 left

Unity 常用排序算法

冒泡排序

  • 冒泡排序算法,它是最慢的排序算法之一,但也是一种容易实现的排序算法。比较相邻的数据
function maopao(list){
  let len=list.length;
  for(let i=0;i<len;i++){          //控制循环的次数
    for(let j=0;j<len-i-1;j++){    //控制每次循环比较的次数
      if(list[j]>list[j+1]){
        swap(list,j,j+1)
      }
    }
  }
  return list
}

选择排序

  • 选择排序从数组的开头开始,将第一个元素和其他元素进行比较。检查完所有元素后,最小的元素会被放到数组第一位置,然后算法会从第二的位置继续。一直进行,当进行到数组的倒数第二个位置时,所有的数据便会完成排序
  • 在时间复杂度上表现最稳定的排序算法之一,因为无论什么数据进去都是O(n²)的时间复杂度。。。所以用到它的时候,数据规模越小越好
function selectionSort(list) {      //选择排序
  let min;
  for(let i=0;i<list.length-1;i++){     //控制循环的次数
      min=i;
      for(let j=i+1;j<list.length;j++){  //控制每次循环比较的次数
          if(list[j]<list[min]){   //寻找最小的数
              min=j;               //将最小数的索引保存
          }
      }
      swap(list,i,min);
  }
  return list
}

归并排序

  • 作为一种典型的分而治之思想的算法应用,归并排序的实现有两种方法:
    - 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第2种方法)
    - 自下而上的迭代
function mergeSort(arr) {  //采用自上而下的递归方法
    let len = arr.length;
    if(len < 2) {
        return arr;
    }
    let middle = Math.floor(len / 2),
        left = arr.slice(0, middle),
        right = arr.slice(middle);
    return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
    let 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;
}
console.log(mergeSort(list));

快速排序

  • 本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高! 它是处理大数据最快的排序算法之一了。
  • 快速排序的最坏运行情况是O(n²),比如说顺序数列的快排。但它的平摊期望时间是O(n log n) ,且O(n log n)记号中隐含的常数因子很小,比复杂度稳定等于O(n log n)的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序
function quickSort(arr, left, right) {
    var len = arr.length,
        partitionIndex,
        left = typeof left != 'number' ? 0 : left,
        right = typeof right != 'number' ? len - 1 : right;

    if (left < right) {
        partitionIndex = partition(arr, left, right);
        quickSort(arr, left, partitionIndex-1);
        quickSort(arr, partitionIndex+1, right);
    }
    return arr;
}
function partition(arr, left ,right) {     //分区操作
    var pivot = left,                      //设定基准值(pivot)
        index = pivot + 1;
    for (var i = index; i <= right; i++) {
        if (arr[i] < arr[pivot]) {
            swap(arr, i, index);
            index++;
        }
    }
    swap(arr, pivot, index - 1);
    return index-1;
}
console.log(quickSort(list));

堆排序

  • 堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:
    - 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列
    - 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列
var len;    //因为声明的多个函数都需要数据长度,所以把len设置成为全局变量

function buildMaxHeap(arr) {   //建立大顶堆
    len = arr.length;
    for (var i = Math.floor(len/2); i >= 0; i--) {
        heapify(arr, i);
    }
}

function heapify(arr, i) {     //堆调整
    var left = 2 * i + 1,
        right = 2 * i + 2,
        largest = i;

    if (left < len && arr[left] > arr[largest]) {
        largest = left;
    }

    if (right < len && arr[right] > arr[largest]) {
        largest = right;
    }

    if (largest != i) {
        swap(arr, i, largest);
        heapify(arr, largest);
    }
}

function swap(arr, i, j) {
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

function heapSort(arr) {
    buildMaxHeap(arr);

    for (var i = arr.length-1; i > 0; i--) {
        swap(arr, 0, i);
        len--;
        heapify(arr, 0);
    }
    return arr;
}

标签:function,arr,right,len,排序,left
From: https://www.cnblogs.com/comradexiao/p/18496271

相关文章

  • P7910 [CSP-J 2021] 插入排序 题解
    正解首先要注意$2$点:修改数组元素的值会影响接下来的操作.对数组进行排序不会影响接下来的操作.思路直接扫一遍数组.假设排序后$a_x$会在第$p$位上.将$p$初始化为$n$.然后就开始找$x$前后有多少个小于$a_x$的值就行了.时间复杂度:$\Theta(nq)$.注意......
  • 快速排序
    一、快速排序的介绍快速排序简单来说就是指先选择一个基准元素(默认第一个是基准元素),再去找到比基准元素大的元素,放在基准元素的右边,比基准元素小的放在基准元素的左边,再将找到的最后一个比基准元素小的元素与基准元素进行交换动画演示的网址https://visualgo.net/en/sorting......
  • 选择排序
    一、选择排序的介绍简单来说就是,先从数组中找到最小的那个数(先默认第一个数为最小的),对他进行标记(使用一个变量存储它的下标,遇到比他小的更新下标),直到找到数组中的最后一个数,然后将最小的那个数与第一个数进行交换。接下来我们使用动画演示进行解释下面的是网址跟截屏以及如何......
  • 排序(一)插入排序,希尔排序,选择排序,堆排序,冒泡排序
    目录一.排序1.插入排序2.希尔排序3.选择排序4.堆排序5.冒泡排序二.整体代码1.Sort.h2.Sort.c3.test.c一.排序1.插入排序插入排序基本思想:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序......
  • 冒泡排序
    一、冒泡排序的介绍冒泡排序简单的来说就是将第一个数与第二个数进行比较,如果第一个数大就进行交换,这样比到最后就是这组数中最大数,下面将使用动画演示来展示冒泡排序https://visualgo.net/en/sorting这是一个可视化界面,可以详细的查看相关的排序动画。二、代码进行演示接下......
  • python中的字典排序--sorted()
    字典的排序:在学习python的时候,了解到相比于列表,字典是一个无序的数据结构,一般都不对其进行排序的。但是要想对字典进行排序,是可以通过sorted()函数进行操作的!关于字典的排序,下面从键key和值value进行代码的运行和分析:【先看代码和执行结果,后面会进行详细的解析】#先定义一......
  • 排序算法 —— 快速排序(理论+代码)
    目录1.快速排序的思想2.快速排序的实现hoare版挖坑法前后指针法快排代码汇总3.快速排序的优化三数取中小区间优化三路划分4.快速排序的非递归版本5.快速排序总结1.快速排序的思想快速排序是一种类似于二叉树结构的排序方法。其基本思想为从待排序序列中任取一个......
  • echarts根据数据动态生成饼图的个数,并排序
    动态生成个数functioninitPurchaseContract(){//获取数据的keysletkeys=Object.keys(dataPurchaseContract[0]);lettotalCharts=keys.length-1;//饼图数量//动态计算行数和列数(使布局接近正方形)letcols=3;//列数letrows......
  • 必学排序算法——归并排序
    目录前言一、什么是归并排序二、归并排序步骤三、算法思想四、归并排序复杂度分析五、优化方案六、算法图解七、c++代码模板八、经典例题1.排序数组代码题解2.排序链表代码题解九、结语前言归并排序算法是必须掌握的一种基础算法,在一些比较出名的竞赛acm、蓝桥杯,......
  • 关于如何排序使得最终的答案最优的总结
    关于如何排序使得最终的答案最优的总结例题LuoguP1012CF2024C分析就以先CF2024C来展开,题意是给定\(N\)个二元组,确定一个可行的排列使得最后的序列逆序对个数最少,注意二元组内部不可以交换顺序Solution1详情见“CF980Review”中对这道题的解法,这里不多赘述了。只......