二分插入排序(BinaryInsertSort)

C#:实现BinaryInsertionSorter折半插入排序算法(附完整源码) 阅读详情

一. 目的
练下算法导论习题,通过二分法查找,快速定位插入位置。
二. 实现代码
实现代码
1、排序代码

        //二分法插入排序
        void InsertSortVerBinary(T testArray[],int nSize){
            LogInfo<T> log = LogInfo<T>();
            T key;
            log.ShowState("原始数组为:");
            log.ShowArray(testArray, nSize);
            int nPos(0),j(0);
            for (int i = 1; i < nSize; i++){
                if (testArray[i] < testArray[i - 1]){
                    key = testArray[i];
                    //获取最大可插入位置
                    nPos = BinarySerch(testArray, i, key);
                    //元素依次后移
                    for (j = i - 1; j>=nPos; j--){
                        testArray[j + 1] = testArray[j];
                    }
                    testArray[nPos] = key;
                }
            }
            log.ShowState("最终数组为:");
            log.ShowArray(testArray, nSize);
        }

2、二分查找代码

        //二分法查找位置
        int BinarySerch(T testArray[], int nSize,T key){
            int nStart(0), nEnd(nSize - 1);
            int nMid = (nStart + nEnd) / 2;
            while (nStart < nEnd){
                if (testArray[nMid]>key){
                    nEnd = nMid - 1;
                }
                else if (testArray[nMid] <= key){
                    nStart = nMid + 1;
                }
                nMid = (nStart + nEnd) / 2;
            }
            return key >= testArray[nMid] ? nMid +1: nMid;
        }

测试结果
这里写图片描述
三. 错误
1、二分查找的数组元素个数误写为元素下标上限。
2、对于中间位置是否就是元素应该插入位置,处理不到。如i=Start,i+1=End,此时I位置为中间。在进行下一步,End=Start,只处理上限位置。没有处理下限位置。导致排序出错。
3、对于二分插入排序,理解没到位以为是O(nlogn)复杂度。
四. 经验总结
1、数组使用注意上下标。
2、注意处理边界。另一方面,可以对二分查找进行优化,不用判断边界。如优先判断Start,然后返回Start作为查找位置。将While条件注意处理Start=End的情况。代码如下:

        //二分法查找位置
        int BinarySerch(T testArray[], int nSize,T key){
            int nStart(0), nEnd(nSize - 1);
            int nMid = (nStart + nEnd) / 2;
            while (nStart <= nEnd){
                if (testArray[nMid] <= key){
                    nStart = nMid + 1;
                }
                else if (testArray[nMid]>key){
                    nEnd = nMid - 1;
                }
                nMid = (nStart + nEnd) / 2;
            }
            return nStart;
        }

3、二分法插入排序与普通排序只是减少了比较时间,仍然为O(n^2)算法复杂度。K个元素时,平均时间算法如下:平均移动位置K/2,查找时间logk,求和为可得到上确界,N*N/4-nlogn,复杂度仍旧为O(N^2).
五. 后续计划
练习给定一个元素,从数组中找出任意两个元素和等于该元素的组合。
六. 参考文献
1、算法导论
2、 二分排序法(折半插入法)http://blog.youkuaiyun.com/hopedengxiwang/article/details/6943892

二分排序(快排) C语言二分排序代码,简单明了。。。。。。。。。。。。 立即下载

相关推荐

MRI多序列,多中心数据集预处理--使用FSL-Flirt 配准数据

FLIRT(FMRIB 的线性图像配准工具)是用于线性(仿射)模态内和模态间脑图像配准的全自动稳健且准确的工具。 什么是配准 在这两张图片上,很容易看出它们没有对齐,左边相对右边倾斜,虽然我们人类视觉系统还是能把对应的解剖关系连系在一起,但是我们使用计算机分析时确不能够 因此,我们希望相同的解剖结构对齐,用坐标表示的话,希望他们在相同的坐标上。如下图 对齐这些解剖结构的过程就叫做配准(register) 因此,配准的目的也是使相同的解剖结构在同一个位置,便于分析。可以将CT和MRI配准,看同一结构在两个

Tina姐的博客 1万+

插入排序之——二分(折半)插入排序(c/c++)

相比较直接插入排序,二分插入的优势在于:对待排序数所应该插入的位置的计算是通过二分法来寻找的,这种二分查找的时间复杂度为o(logn);而直接插入是依次寻找位置的,时间复杂度可看作o(n)。 故二分插入排序是一种优化过的插入排序。 其中排序函数insetSort中的while循环判定条件为low<=high,当循环结束后,high+1处为待排序数该插入的位置,然后我们在进行后续的数组移动,...

Little_ant_的博客 1878

【STM32】STM32F407实现简单的Modbus协议

1.ModBus协议简介 MODBUS协议是一种串行通信协议,由Modicon公司(施耐德公司前身)发表,由于其公开发表且无版权要求,易于部署和维护,在工业界广泛应用。MODBUS采用主从通信(Master/Slave),MODBUS有三种报文格式:ASCII、RTU、TCP,本文主要讨论RTU。 如下图所示,串行通信上的MODBUS协议主要由地址,功能码,数据,CRC校验四部分数据帧构成。主机和从机的串行通信设备要求一致,参数要求一致,即假设使用串口,主从机波特率,奇偶校验...

BadBoyHolly的博客 8185

二分插入排序

二分插入排序也是一种插入排序,原理和插入排序是一样的,但是之所以二分是快速查找出要插入的位置 下面附上代码和图示解析 #include"iostream" #include"cstdio" using namespace std; int a[]={0,12,324,5,6768,78,79,7}; int length=0; int main() { length=sizeof

72 73 76 89 82 84 89 81 521

FCKeditor 2.6.4 php版本任意文件上传——漏洞复现

一、漏洞描述 FCKeditor是目前最优秀的可见即可得网页编辑器之一,它采用JavaScript编写。具备功能强大、配置容易、跨浏览器、支持多种编程语言、开源等特点。它非常流行,互联网上很容易找到相关技术文档,国内许多Web项目和大型网站均采用了FCKeditor。 Fckeditor 低于 2.6.4 php 版本任意文件上传漏洞,当您的PHP环境配置为 GPC = Off 时可绕过currentfolder参数过滤上传脚本木马控制网站服务器 二、漏洞原理 漏洞版本:<=2.6.4 三、环境搭建

W小哥 1万+

别再死记硬背公式了!用Multisim仿真软件,5分钟搞懂三极管放大电路的工作原理

本文介绍如何利用Multisim仿真软件快速掌握三极管放大电路的工作原理,避免死记硬背公式。通过动态实验和参数调整,直观理解三极管的工作状态和放大效果,提升学习效率和实践能力。

weixin_30566063的博客 568

BinaryInsert二分插入排序

package com.jt.pojo; import java.util.Arrays; public class BinaryInsert { public static void main(String[] args) { int[] a = {1,3,5,7,2}; sort(a); System.out.println(Arrays.toString(a)); } public static void sort(int

qq_48974601的博客 185

【Python图像处理局部放大】输入图像,选择两处不同的区域进行放大操作,然后将原始图像、处理后的两个区域以及标记合成新图像进行展示

Python图像处理与区域放大连接标记:选择特定区域并对其进行放大操作,然后将原始图像、处理后的两个区域进行标记后的新图像保存到文件中。

qq_35831906的博客 2243

mysql binary insert_MYSQL的binary解决mysql数据大小写敏感问题的方法

复制代码 代码如下:mysql> select binary 'ABCD'='abcd' COM1, 'ABCD'='abcd' COM2;+--------+-----------+| COM1 | COM2 |+--------+-----------+| 0 | 1 |+---------+-----------+1 row in set (0.0...

weixin_36018773的博客 849

【信息科学与工程学】【物理/化学科学和工程技术】第八篇 光学07

对于光源-探测器距离 ρ, 稳态漫反射率 R(ρ) ≈ (1/(4π)) [ z₀ (μ_eff + 1/r₁) exp(-μ_eff r₁)/r₁² + (z₀ + 2z_b) (μ_eff + 1/r₂) exp(-μ_eff r₂)/r₂² ], 其中 μ_eff = √(3μ_a(μ_a+μ_s’)), z₀=1/μ_s’, z_b 与边界条件有关。通过测量光纤各点的布里渊频移 ν_B(z) 来得到应变/温度分布:Δν_B(z) = C_ν,ε Δε(z) + C_ν,T ΔT(z)。

weixin_49199313的博客 329

在 SAP HANA 里为视图创建 Analytic Privilege,真正把同一份数据按角色切开

摘要:本文介绍了SAP HANA中基于业务角色的动态数据权限控制方法。通过Analytic Privilege技术,可以在同一视图上为不同角色设置不同的数据访问范围,实现行级安全控制。核心机制包括:1) 创建带有STRUCTURED PRIVILEGE CHECK的视图;2) 建立授权对象和用户映射表;3) 开发条件提供过程动态生成过滤条件;4) 创建结构化权限对象绑定条件提供器。这种设计使权限规则与业务数据解耦,便于维护变更,适合销售区域、财务数据等多角色访问控制场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2392

java_BinaryInsertSort二分法插入排序

1.java代码        int [] a={9,3,2,4,10,44,83,28,22,76,1,5,0,-1};        for (int i = 0; i &lt; a.length; i++) {            int temp =a[i];//待插入到前面有序序列的值            int left=0; //左下标            int right...

qq_34412985的博客 250

ubuntu emto-cpa安装与编译

ubuntu emto-cpa安装与编译

qq_45834835的博客 1436

二分插入排序 和 二分检索

#include #include #include #define N 10#define sortObject int* void binarySort(sortObject array){ int mid, left, right, temp, i, j; for(i = 1; i  {   left = 0;   right = i - 1;   temp = array[i]; 

LiYang2087的专栏 619

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数据结构复习:直接插入排序与二分插入排序的C++实现

1.直接插入排序 直接插入排序的过程可以理解为一个固定长度的数组被分为两个集合,即已排序集合和未排序。 开始时已排序集合为空,而未排序集合即为整个数组。当排序开始后插入一个对象,已排序集合元素数目加1,相应地未排序集合元素数目减1,重复插入过程直至将未排序集合清空为止,这时排序集合就是最终结果。如下图: C++实现如下,为了使得程序可以对各种基本数据类型都能排序,使用了模板类,注意模板类...

weixin_34087503的博客 188

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++ 二分插入排序

#include using namespace std; void insert_sort(int a[], int n); int main(){ int a[]={ 3,7,2,9,6,5,8,1,4}; insert_sort(a,9); return 0; } void insert_sort(int a[], int n) { int

zhanghaotian2011的专栏 1910

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【转】数据结构图文解析之:直接插入排序及其优化(二分插入排序)解析及C++实现...

以下转载自http://www.cnblogs.com/QG-whz/p/5194569.html 阅读目录 0. 数据结构图文解析系列 1. 插入排序简介 2. 直接插入排序图解 2.1. 代码实现 2.2. 复杂度分析 2.3. 稳定性 3. 二分查找插入排序 3.2. 复杂度分析 3.3. 稳定性 正文 回到顶部 0. ...

weixin_30905133的博客 146

C++ 折半插入排序(BinaryInsertSort)

一、思路: 较插入排序,减少了比较的次数,但是插入时间还是一样。 (1)按二分查找的方法,查找V[i]在V[0],V[1]…V[i-1]中插入的位置; (2)将插入位置的元素向后顺移。 二、实现程序: // 二分插入:较插入排序,减少了比较的次数,但是插入时间还是一样 // 时间复杂度还是:O(n*n) #include <iostream&g...

ChanJose的博客 684

排序算法之二 插入排序(C++版本)

插入排序的相关知识,参考漫画:什么是插入排序? 插入排序有两个版本: 第一个版本每次 void InsertSort(int* pData, int size) { if (nullptr == pData || size <= 0) return; for (int idx = 1; idx < size; ++idx) // idx为每轮待插入数据的下标 { int t...

xupeng1644的博客 1403

排序(选择、希尔、二分插入)

选择排序法 第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排...

weixin_34153893的博客 81

插入排序_C++实现

#include <iostream> using namespace std; //插入排序函数 int* insert_Sort(int A[],int num); //重载输出函数,使得 “<<” 能够输出数组 ostream &operator <<(ostream &os, int* A); int main() { int a...

小吴Der 258

折半插入排序

C语言实现折半插入排序代码如下: #include<stdio.h> #define N 10000//定义数组最大长度10000 void BinaryInsertSort(int s[],int n)//自定义折半插入排序函数,s为数组名,n为数组长度 { int i,position,t,k;//position为s[i]经折半查找所确定的位置 for(i=1;i<n;i++){//下标从0开始,从i=1开始向前插入 int l=0,r=i;

qq_51500472的博客 228

BinaryInsertSort

class BinaryInsertSort {    public static void main(String[] args)     {        int[] array = new int[]{ 3, 5,2,8,4,9,-1,7 };        for(int num : array)            System.out.println(num);        l

cleverd 1177
上一篇: 桶排序(BucketSort)
下一篇: 练习:根据和值查找数组中组合
庄放
博客等级 码龄15年 1粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值