首页 > 其他分享 >插入排序及C语言实现

插入排序及C语言实现

时间:2023-06-20 18:01:10浏览次数:29  
标签:arr 实现 插入排序 元素 C语言 int key 序列 排序

一、插入排序原理

插入排序是一种简单的排序算法,其基本思想是将未排序序列中的每个元素依次插入到已排序的序列中合适的位置。具体来说,假设待排序的序列为 a1,a2,⋯,an,则从 a2 开始遍历整个序列,将 ai 插入到前面的已排序序列 a1,⋯,ai−1 中,直到所有的元素都被插入到已排序的序列中。

插入排序的实现通常采用两层循环结构。外层循环负责遍历未排序序列,内层循环则负责在已排序序列中寻找合适的插入位置。具体的实现步骤如下:

  1. 从第二个元素开始,依次遍历整个序列,将当前遍历到的元素标记为 key
  2. key 与前面已排序的元素从后往前逐一比较,如果存在某个元素大于 key,则将该元素后移一位;
  3. 直到找到一个元素小于等于 key,或者已经找到了序列的起始位置,将 key 插入到该元素的后面;
  4. 重复步骤 1~3,直到所有元素都被遍历完毕。

二、下面是插入排序的 C 语言实现

void insertionSort(int arr[], int n) {
    int i, j, key;
    for (i = 1; i < n; i++) {
        key = arr[i];
        j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

该实现函数接受两个参数,分别为待排序的数组和数组长度 n。在函数内部,外层循环从第二个元素开始遍历整个序列,内层循环则负责在已排序序列中寻找合适的插入位置。将键值 key 插入到数组之前,需要先将大于 key 的所有元素向右移动一个位置,为 key 腾出一个位置。

调用示例:

#include <stdio.h>

void insertionSort(int arr[], int n);

int main() {
    int arr[] = {4, 2, 7, 5, 1, 3};
    int n = sizeof(arr) / sizeof(arr[0]);
    insertionSort(arr, n);
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

输出结果为:

【1 2 3 4 5 7】

注意,在 C 语言中,数组的下标是从 0 开始计数的,因此在插入排序算法的实现中,也需要注意数组下标的起始值。

标签:arr,实现,插入排序,元素,C语言,int,key,序列,排序
From: https://blog.51cto.com/u_15903730/6524188

相关文章

  • C 语言 GCC 内嵌函数实现 Lambda 表达式
    代码({//函数实现函数名称;})#include<stdio.h>#include<malloc.h>#defineaction_lambda(function_body)\({voidlambda_funcfunction_bodylambda_func;})#definefunc_lambda(return_type,function_body)\({return_typelambda_funcfunction_b......
  • TwinCAT3 - 实现自己的Tc2_SerialCom
    目录1,前言2,原生Tc2_SerialCom简单使用3,实现自己的Tc2_SerialCom3.1,EL6inData22B,EL6outData22B3.2,ComBuffer3.3,SerialLineControl3.4,SendString,ReceiveString4,自己的Tc2_SerialCom简单使用5,总结1,前言在TwinCAT3中,典型的串口通信,硬件需要模块EL6022(类似的模块有EL6001、EL6002、E......
  • 批量打印文件doc,设置几分,powershell实现
    $folderPath="C:\path\to\folder"$printCopies=3Get-ChildItem-Path$folderPath-Filter*.doc|ForEach-Object{for($i=0;$i-lt$printCopies;$i++){Start-Process-FilePath$_.FullName-VerbPrint}}#一定要指定默认打印机......
  • 浅谈项目核算的“全程利润”实现模式
    “怎样评估各事业群/项目群的业绩?如何引导决策?”“今年的利润怎么分配?没有细化的分配依据,怎么办?”“开了这么多类型的项目,是不是有些盲目?资源这么紧张,明年要怎么做?”这一系列的问题,几乎所有的企业都会面临,怎么破?怎么解?用友针对以上困惑推出了一项新的解决方案“项目财务管理PFM”,将......
  • 微信小程序开发实现星星评分组件
    微信小程序开发实现星星评分组件问题背景小程序开发中经常会碰到需要评分的场景,比如用户满意度调查等,本文介绍微信小程序实现打星评分的一种方案。实现效果如下:截图2问题分析话不多说,直接上代码。(1)index.wxml文件代码如下:<viewclass="vertical-star-item">......
  • vue鼠标拖拽自定义指令实现过程和原理分析
    在Vue中,可以使用自定义指令来实现鼠标拖拽的功能。自定义指令允许我们在DOM元素上绑定特定的行为和逻辑。以下是一个实现鼠标拖拽的自定义指令的例子,同时也包含了相应的原理分析:<template><divv-draggable>DragMe!</div></template><script>exportdefault{directives......
  • requests爬虫实践之安居客二手房屋数据(python实现)
    1.先从安居客官网上淘到如下数据(详细方法可见博主爬取爱彼迎那篇博客):2.源码(警告:若频繁爬取安居客官网数据,将被要求入网验证…)importrequestsfrombs4importBeautifulSoupheaders={'user-agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,l......
  • C++用纯虚函数实现协议委托的例子
      C++不像其他很多编程语言有接口、委托或者协议的概念,但是利用纯虚函数和C++多重继承的特性,我们也能实现接口、委托或协议要做的事情,下面的通过一个人设置闹钟然后被闹钟唤醒的例子来说明如何在C++中实现委托回调。#include<iostream>#include<unistd.h>usingstd::cout;u......
  • Java实现ModbusTCP通信---功能码
    原网址:https://blog.csdn.net/liuyuinsdu/article/details/113879460                         ......
  • 精通C语言中的函数:创建模块化代码
    在C语言中,函数是一种非常重要的概念,它允许我们将代码划分为模块化的部分,提高代码的可读性和可维护性。函数还可以被多次调用,避免代码的冗余。本文将探索C语言中的函数,并提供相关的代码示例,帮助你更好地理解和应用函数的概念。函数的定义和调用在C语言中,函数由函数头和函数体组成。......