首页 > 编程语言 >直接插入排序算法及其改进

直接插入排序算法及其改进

时间:2023-09-19 22:04:04浏览次数:40  
标签:二分 int vi 插入排序 元素 改进 算法 key

插入排序,分为直接插排,和二分插排

直接插入排序

直接插入排序算法及其改进_数组

大体思路:选取<数组>,将其余数依次按顺序往里放。 (C语言实现)

#include <stdio.h>
void insertSort(int *a);
int main() {
    int a[6] = { 5,2,4,6,1,3 };   //这里也可以改成自定义数组
    insertSort(a);
    int k;
    for (k = 0; k < 6;k++) {
        printf("%d ", a[k]);
    }
    getchar();
    return 0;
}
void insertSort(int *a) {
    int i, j,key;
    //这里是从第二个元素开始的
    for (j = 1; j < 6; j++) {
        key = a[j];
        //上一个元素
        i = j - 1;

        //数组下标0开始所以>=0
        while (i >= 0 && a[i] > key){   //一定要有 i>=0 这步,这关系到 i=i-1 的下一步是否进行while循环
            a[i + 1] = a[i];
            i = i - 1;
        }
       a[i + 1] = key;
    }
}

上面代码中为什么要有"key=a[i]":选取“傀儡变量”,下面令a[i+1]=a[i];若a[i]没有提前准备好“副本”,经过这一步时,原a[j]的位置已经变成了a[i](下面a[i+1]被a[i]赋值),毫无意义。。。。。。

直接插入排序算法及其改进_二分插入排序_02

算法改进:

二分插入排序

与直接插排的区别:在有序区查找新元素插入位置时,为了减少元素比较次数,提高效率,采用二分查找法确定插入位置。 算法分析: 设数组为a[0…n]。

  1. 将原序列分成有序区和无序区。a[0…i-1]为有序区,a[i…n] 为无序区。(i从1开始)
  2. 从无序区中取出第一个元素,即a[i],使用二分查找算法在有序区中查找要插入的位置索引j。
  3. 将a[j]到a[i-1]的元素后移,并将a[i]赋值给a[j]。
  4. 重复步骤2~3,直到无序区元素为0。
// 二分插入排序
void BinInsertSort(vector<int> &vi)
{
    for(int i=1;i<vi.size();i++)
    {
        int left=0;
        int right=i-1;
        int temp=vi[i]
        while(left<=right)
        {
            int mid=(left+right)/2; //二分区域
            if(vi[mid]>temp)
            {
                right=mid-1;       //向左缩小区域
            }
            else
            {
                left=mid+1;        //向右缩小区域
            }
        }
        for(int j=i-1;j>left;j--)  //vi[left,i-1]的元素整体后移
        {
            vi[j+1]=vi[j];
        }
        vi[left]=temp;
    }
}

标签:二分,int,vi,插入排序,元素,改进,算法,key
From: https://blog.51cto.com/u_15296224/7529627

相关文章

  • 希尔排序:优化的插入排序
    希尔排序(ShellSort)是一种插入排序的改进算法,它通过比较相距一定间隔的元素进行排序,逐步减小间隔,最终实现整体有序。本文将详细介绍希尔排序的工作原理,提供示例和Python、Go、Java以及C语言的实现代码。希尔排序的基本思想希尔排序的核心思想是将整个待排序序列分割成若干个子序列,......
  • 快速排序算法
    快速排序1.快速排序的思想快速排序是一种分治的排序算法,是对于冒泡排序的改进算法,在C语言标准库中的函数qsort()的实现就是快速排序。(下述快速排序都是最后要求值按从小到大排序)快速排序的核心思想在于:每次都选择主元,然后利用主元进行划分,使得左边的元素都小于主元,右边的元素......
  • Lnton羚通机器视觉算法平台人员入侵检测 重点区域人员徘徊算法检测
    Lnton羚通的算法算力云平台是一款出色的解决方案,具备突出的特点。该平台提供高性能、高可靠性、高可扩展性和低成本的功能,使用户能够高效地执行各种复杂的计算任务。此外,平台还提供了丰富的算法库和工具,支持用户上传和部署自定义算法,提高了平台的灵活性和个性化能力。人员闯入识别......
  • 文心一言 VS 讯飞星火 VS chatgpt (96)-- 算法导论9.3 1题
    一、用go语言,在算法SELECT中,输人元素被分为每组5个元素。如果它们被分为每组7个元素,该算法仍然会是线性时间吗?证明:如果分成每组3个元素,SELECT的运行时间不是线性的。文心一言:在算法分析中,一个算法的运行时间是否线性依赖于其输入数据的大小。线性时间意味着算法的运行......
  • 文心一言 VS 讯飞星火 VS chatgpt (96)-- 算法导论9.3 1题
    一、用go语言,在算法SELECT中,输人元素被分为每组5个元素。如果它们被分为每组7个元素,该算法仍然会是线性时间吗?证明:如果分成每组3个元素,SELECT的运行时间不是线性的。文心一言:在算法分析中,一个算法的运行时间是否线性依赖于其输入数据的大小。线性时间意味着算法的运行时......
  • 关于一个BitMap的算法理解
      最近在看算法,想学习一下算法这玩意,虽然工作中很少用到。在《小灰的算法之旅》这本书中,有一个关于BitMap的算法。  早期接触过一点类似的,有人在数据库里面保存了一个字符串  000000000000000000,000000000001000001,这种,每一位代表一个含义,比如第一位为1表示这个用户是上......
  • 代码随想录算法训练营第十一天
    代码随想录算法训练营第十一天|LeetCode239(滑动窗口最大值)LeetCode347(前K个高频元素)239:滑动窗口最大值LeetCode239(滑动窗口最大值)importjava.util.Deque;importjava.util.LinkedList;classSolution{publicint[]maxSlidingWindow(int[]nums,intk)......
  • 流形-流形学习算法
      流形是指连在一起的区域:是一组点的集合,且每个点都有邻域。(也就意味着流形中某个元素可以通过某种方式移动到其邻域位置)  在机器学习中,我们允许流形的维数从一个点到另一个点有所变化。(这通常发生在流形与自身相交的情况。例如数字8,流形大多数位置只有一维,但在中心相交的时......
  • 改进了headers的爬虫(Cookies)
    importurllib.requestfromlxmlimportetreedefcreate_request(page):ifpage==1:url='http://www.chinaeol.net/hjxw/gnxw'else:url='http://www.chinaeol.net/hjxw/gnxw/index_'+str(page)+'.shtml�......
  • 数论——欧几里得算法和扩展欧几里得算法 学习笔记
    数论——欧几里得算法和扩展欧几里得算法引入最大公约数最大公约数即为GreatestCommonDivisor,常缩写为gcd。一组整数的公约数,是指同时是这组数中每一个数的约数的数。\(\pm1\)是任意一组整数的公约数;一组整数的最大公约数,是指所有公约数里面最大的一个。最小公倍数最......