排序

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
}

image

选择排序

  • 选择排序从数组的开头开始,将第一个元素和其他元素进行比较。检查完所有元素后,最小的元素会被放到数组第一位置,然后算法会从第二的位置继续。一直进行,当进行到数组的倒数第二个位置时,所有的数据便会完成排序
  • 在时间复杂度上表现最稳定的排序算法之一,因为无论什么数据进去都是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
}

image

插入排序

n个元素,分成一个有序序列和无序序列,开始有序序列只有一个元素,无序序列包含n-1个元素,排序时每次从无序序列取出第一个元素,和有序序列的元素的排序码进行比较,然后放到合适的位置,最后形成新的有序序列。
image

归并排序

  • 作为一种典型的分而治之思想的算法应用,归并排序的实现有两种方法:
    - 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第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));

image

快速排序

  • 本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高! 它是处理大数据最快的排序算法之一了。
  • 快速排序的最坏运行情况是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));

image

堆排序

  • 堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:
    - 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列
    - 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列
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;
}

参考文档

希尔排序

image

计数排序

image

桶排序

image

基数排序

是将整数按位数切割成不同的数字,然后按每个位数分别比较。
image

posted @ 2024-10-23 14:18  请明月  阅读(7)  评论(0编辑  收藏  举报