本文介绍: 插入排序是一种简单直观的排序算法,它的工作原理通过构建有序序列,对于未排序数据,在已排序列中从后向前扫描找到相应位置插入插入排序实现上,通常采用 inplace 排序(即只需用到 O(1) 的额外空间排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间

0. 简介       

        插入排序(Insertion Sort 是一种简单直观的排序算法,它的工作原理通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描找到相应位置插入插入排序实现上,通常采用 inplace 排序(即只需用到 O(1) 的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间


1. 插入排序实现

插入排序基本思想:

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

插入排序过程演示

367e3c9d2d6d4004a720bba75ba79dab.gif


2. 插入排序时空复杂度分析

插入排序的时间复杂度和空间复杂度如下

  1. 时间复杂度

  2. 空间复杂度:

总结:插入排序的平均和最坏情况时间复杂度都是 O(n^2),空间复杂度是 O(1)。

需要注意的是,插入排序适用于部分已排序的情况,这时其效率相对较高。


3. 插入排序C语言代码

C代码实现:

#include <stdio.h>  
  
void insertionSort(int arr[], int n) {  
    int i, key, j;  
    for (i = 1; i < n; i++) {  
        key = arr[i];  
        j = i - 1;  
  
        //将arr[0..i-1]中大于key的元素移动当前位置之前的一个位置 
        while (j >= 0 && arr[j] > key) {  
            arr[j + 1] = arr[j];  
            j = j - 1;  
        }  
        arr[j + 1] = key;  
    }  
}  
  
void printArray(int arr[], int n) {  
    int i;  
    for (i = 0; i < n; i++) {  
        printf("%d ", arr[i]);  
    }  
    printf("n");  
}  
  
int main() {  
    int arr[] = {12, 11, 13, 5, 6};  
    int n = sizeof(arr) / sizeof(arr[0]);  
    insertionSort(arr, n);  
    printArray(arr, n);  
    return 0;  
}

代码详解

  1. void insertionSort(int arr[], int n) 函数定义一个整数数组 arr[] 进行插入排序的函数,其中 n 是数组的长度
  2. for 循环中,从数组的第二个元素开始(索引为1),每一个元素都被视为需要插入到已排序子数组的新元素。key 存储当前正在考虑的元素的值。
  3. while 循环用于移动所有大于 key 的已排序元素向右移动一位,以便key 提供空间。一旦找到 key正确位置或到达数组的开头循环就会停止然后,将 key 插入到正确的位置。
  4. printArray 函数用于打印已排序的数组。在 main 函数中,我们定义一个需要排序的数组,并调用 insertionSort 函数进行排序。最后,打印已排序的数组。

4. 插入排序代码运行结果

代码运行结果

f7ddfc2c5dca40b383151c15cfa754d2.png

 

原文地址:https://blog.csdn.net/Liu_eight_nine/article/details/134717261

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_36962.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注