排序算法总结:十大经典算法1

算法概述

1、排序分类

   比较类排序:通过比较来决定元素间的相对次序,由于时间复杂度不能突破O(nlogn),因此也称非线性时间比较类排序

  非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也成为线性时间非比较类排序。

 

2、算法复杂度

  

 

 

3、相关概念:

  稳定:排序后,每个元素的位置是固定的,相同数字的位置不会有更改。

  不稳定:相同数字的位置可能会发生变化,

  时间复杂度:对排序数据的总的操作次数。反应当n变化时,操作次数呈现什么规律。

  空间复杂度:是指算法在计算机内执行时所需要储存空间的度量,它也是数量规模n的函数。

 

1、冒泡排序

   冒泡排序是一种简单的排序算法。它重复的走访要排序的数列,一个比较两个元素,如果它们顺序错误,就把他们交换过来。

  这样的走访要重复到没有错误的顺序为止,也就是排序完成。

  这个算法的名字由来是 因为越小的元素会经由交换慢慢 浮到数列顶端。

  1.1算法实现描述

    比较相邻的元素,如果第一个比第二个大,就交换它们两个

    对每一对相邻元素做同样的工作,从开始第一对到结尾最后一对,这样在最后的元素应该就是最大的数;

    针对所有元素重复以上步骤,除了最后一个

    重复步骤1~3,知道排序完成

  1.2动图演示

    

  1.3代码实现

    

    /**
    * 冒泡
    * @param arr 要排序的数组
   */
    static quickSort2(arr: number[]): number[] {
        let len = arr.length;
        for (let i = 0; i < len - 1; i++) {
            for (let j = 0; j < len - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    let temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        return arr;
    }

 2、选择排序

  是一种简单直观的排序算法。

  2.1工作原理:

  首先在未排序序列中找到最小(大)元素,存放在排序序列的起始位置,然后,在从剩余的未排序的序列中寻找最小(大)元素,然后放到已排序的末尾。以此类推,直到元素均排序完成。

  2.1算法描述:

  n个记录的直接选择选择排序可经过n-1趟直接选择排序得到有序排序结果。具体算法描述如下:

    初始状态:无序区:q【1....n】,有序区:空

    第i趟排序(i=1,2,3....n-1)开始时,当前有序区和无序区分别为q【1..i-1】和q(i...n)。该趟排序从无序中选出最小的q【k】,将它与无序区第一个记录R交换,

    使q【1...i】和去【i+1,n】变为记录个数加一个新有序区,和记录个数减少一个的新无序区。

  2.3动态演示:

  

  2.4代码实现:

  ts实现代码:

 /**
    * 选择
    * @param arr 要排序的数组
   */
    static selectSort(arr: number[]): number[] {
        let minIndex, temp, len = arr.length;
        for (let i = 0; i < len - 1; i++) {
            minIndex = i;
            for (let j = i + 1; j < len; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
                temp = arr[i];
                arr[i] = arr[minIndex];
                arr[minIndex] = temp;
            }
        }
        return arr;
    }

  2.5算法分析:

   变现最稳定的算法之一,用到这个算法的时候,数据越小越好。

3、插入排序

  3.1工作原理:

  一种简单直观的算法,通过构建有序序列,对于未排序的序列数据,在已排序序列中从后向前扫描,找到相应的位置并插入。

  3.2算法描述:

  一般来说,插入排序都采用in-place在数组上实现,。具体面熟如下:

  1.   从第一个元素开始,该元素可以认为已经排序;
  2.   取出下一个元素,在已经排序的元素中从后往前扫描;
  3.   如果该元素大于新元素,将该元素移到下一个位置;
  4.   重复步骤3,知道找到已排序的元素小于或者等于新元素的位置;
  5.   将新元素插入到该位置;
  6.   重复2~5步骤;

  3.3动图演示

  

  3.4代码实现:

  

  

   /**
      * 插入
      * @param arr 要排序的数组
      */
    static insertionSort(arr: number[]): number[] {
        let preIndex, current, len = arr.length;
        for (let i = 1; i < len; i++) {
    //index记录的是元素的位置 
            preIndex = i - 1;
            current = arr[i];
    //默认第一个数字是已经排序的,取到后面未排序的数字跟前面的排序的数字比较,如果有小于已排序的数字,则大于当前数字的元素后移,
            while (preIndex >= 0 && arr[preIndex] > current) {
                arr[preIndex + 1] = arr[preIndex];
                preIndex--;
            }
    //直到后移结束后,将当前的数字赋值到后移空出来的位置
            arr[preIndex + 1] = current;
        }
        return arr;
    }

 

posted @ 2022-03-24 13:38  jiaxin2015  阅读(43)  评论(0)    收藏  举报