三分钟看懂插入排序算法

版权声明:原创文章转载请注明来源。 https://blog.csdn.net/samll_snail/article/details/86534795

今天我们还来聊一聊另一种排序算法,插入排序。

插入排序,顾名思义,插入操作是整个排序过程中的重要步骤。

首先有必要说明一点,一种特定的算法都是基于某种特定的数据结构的,我们这里的算法都是指数据存放于数组结构中的。

先来用人话给插入排序来个定义:

把数组分成已排序和未排序两个区间,以数组第一个元素当做已排序区间,剩下的即被当做未排序区间,每次都从未排序区间中找出一个元素来和已排序区间中的元素比较,并插入到已排序区间中的合适位置,直到未排序区间元素为 0 。

如果这个定义还没看懂,没关系,我再举一个实际的例子,应该能帮你更好的理解。

新学期体育课,老师通常会按身高高矮来安排同学站队列。首先班上的同学都随便站成一列,老师会把较矮的同学从队列中拉出来,让其站到队列前面,这样其实就把原本无序的队列分成有序和无序两个区间了,前面的都是有序的,后面的都是待排序的。

老师每次从后面拉一个同学出来都会和前面已经排好序的同学比较身高,然后再插入到合适的位置。

在这里,老师是聪明的,看一眼就能知道某个同学该站在哪个位置,但是计算机就不能了,计算机只能一个一个的去比较了,而且只能把第一个元素当做已排序区间,第二个及以后的元素当做未排序区间。

为了更好的理解,这里建议大家认为这个老师很死板,从第二个同学开始和第一个同学比较身高,如果第二个同学比第一个同学还要矮,那就把第二个同学插入到第一个同学的前面,即站第一个位置,这时候第一和第二个同学就是一个新的已排序区间了。

接下来再让第三个同学依次和第一、第二个同学比较身高,并插入到合适的位置。后面的同学都按照同样的方式来比较并插入,到最后就是一个从矮到高的有序队列了。

插入排序其实主要有比较和插入两个操作,先通过比较找到合适的插入位置,由于在数组中插入一个元素是需要移动其后面的所有元素的,因此在依次比较的同时就需要后移空出一个位置来,找到合适的位置后,直接插入就行。

再来分析下插入排序的算法复杂度,简单来说,插入排序有两个嵌套循环,所以时间复杂度为 O(n^2),由于不需要额外的存储空间,所以其空间复杂度为 O(1),而且插入排序不会破坏数组中两个相同元素原有的顺序,因此插入排序是一种稳定的排序算法。

下面我分别用 python 和 php 实现了插入排序算法,代码中有详细的注释说明。

# -*- coding: utf-8 -*-


def insertSort(arr):
    lens = len(arr)
    if lens <= 1:
        return 

    for i in range(1,lens): #先遍历未排序区间元素,从第二个元素开始
        value = arr[i] #获取未排序区间中的第一个元素        
        #开始找插入位置
        for j in range(i,-1,-1): #遍历已排序区间元素,从尾部开始           
            if value < arr[j-1]: #拿未排序区间中的第一个元素和已排序区间中的元素依次比较,直到找到适合插入的位置
                arr[j] = arr[j-1] #往后移动元素,留出插入位置
            else:
                break
        arr[j] = value #将未排序区间拿出来的元素插入到合适的位置

    return arr


arr = [9,824,4,5,2,1,7,8]

print(insertSort(arr))
//php实现插入排序算法

function insertSort($arr){
    $len = count($arr);

    if ($len <= 1){
        return false;
    }

    for ($i=1; $i < $len; $i++) { 
        $val = $arr[$i];
        $j = $i-1;

        for ($j; $j >= 0; $j--) {            
            if($val < $arr[$j]){
                $arr[$j+1] = $arr[$j];              
            }else{
                break;
            }
        }
        $arr[$j+1] = $val;
    }
    return($arr);
}


$arr = [4,6,7,3,22,1,88,456,5];
print_r(insertSort($arr));

猜你喜欢

转载自blog.csdn.net/samll_snail/article/details/86534795
今日推荐