插入法(直接/二分/希尔)

embedded/2024/11/25 13:24:45/
//稳定耗时: 双向冒泡,可指定最大最小值个数MaxMinNum<n=sizeof(Arr)/sizeof(Arr[0]),
void BiBubbleSort(int Arr[],int n,int MaxMinNum){int left=0,right=n-1;int i;bool notDone= true;int temp;int  minPos;while(left<right&&notDone  ){        notDone= false;for(i=left;i<right;i++){if(Arr[i]>Arr[i+1]){//swap(Arr[i],Arr[i+1]);temp=Arr[i];Arr[i]=Arr[i+1];Arr[i+1]=temp;notDone= true;//}// if(Arr[i]<Arr[left])//minPos=i; //最小值//	{//		  temp=Arr[left];//		  Arr[left]=Arr[minPos];// 		  Arr[minPos]=temp;//	}}right--;//右边界增加一个最大值for(i=right-1;i>=left;i--){if(Arr[i]>Arr[i+1]){//swap(Arr[i],Arr[i+1]);temp=Arr[i];Arr[i]=Arr[i+1];Arr[i+1]=temp;notDone= true;}}left++;//左边界增加一个最小值if(MaxMinNum>0){MaxMinNum--;if(MaxMinNum==0)return;}}
}

直接插入

void InsertSort(int* arr, int n)
{for (int i = 0; i < n - 1; ++i){int end = i;//记录有序序列最后一个元素的下标int tem = arr[end + 1];//待插入的元素//单趟排while (end >= 0){//比插入的数大就向后移if (tem < arr[end]){arr[end + 1] = arr[end];end--;}//比插入的数小,跳出循环else{break;}}//tem放到比插入的数小的数的后面arr[end  + 1] = tem;//代码执行到此位置有两种情况://1.待插入元素找到应插入位置(break跳出循环到此)//2.待插入元素比当前有序序列中的所有元素都小(while循环结束后到此)}
}

二分插入法直接插入上改进(n<1024),明显减少数据比较次数,快速定位,n过大不如直接插入快;

a[] 有序:type为 0 时排序从小到大,为 1 时排序从大到小,n=sizeof(a)/sizeof(a[0]);
void InsertSort_binary(int a[],int n)//,int type)
{for ( int i = 1; i < n; i++){int temp=a[i];  //临时待插入值int left=0;  //左侧边界值int right=i-1;  //右侧边界值while (left <= right){// int mid = (left+right) / 2;  //中间值 可能溢出INT_MAX;int mid = left + ( right - left) / 2;if(a[mid] > temp)//if(type == 0 ? (a[mid] > temp) : (a[mid] < temp)){right = mid - 1;   //把右侧边界缩小,在中间值得左边进行寻找}else {left = mid + 1;  //把左侧边界加大,在中间值得右边进行寻找}            }for ( int j = i-1; j >= left; j--)  //将left到i-1之间的数都往后移动一个位置//如果j<left 或j=0,将不会有数进行位置的移动{a[j+1] = a[j];}a[left] = temp;      //将要插入的数值插入到合适位置       }    
}

希尔 非稳定排序,最高效接近快排;

void ShellSort(int* arr, int size)
{int gap = size;while (gap > 1){gap = gap / 3 + 1;	//调整希尔增量int i = 0;for (i = 0; i < size - gap; i++)	//从0遍历到size-gap-1{int end = i;int temp = arr[end + gap];while (end >= 0){if (arr[end] > temp){arr[end + gap] = arr[end];end -= gap;}else{break;}}arr[end + gap] = temp;	//以 end+gap 作为插入位置}}
}

n=10000 时间对比

n=100000 时间对比


http://www.ppmy.cn/embedded/34142.html

相关文章

个人银行账户管理程序(2)

在&#xff08;1&#xff09;的基础上进行改进 1&#xff1a;增加一个静态成员函数total&#xff0c;记录账户总金额和静态成员函数getTotal 2对不需要改变的对象进行const修饰 3多文件实现 account。h文件 #ifndef _ACCOUNT_ #define _ACCOUNT_ class SavingAccount {pri…

开源免费的网盘项目Cloudreve,基于Go云存储个人网盘系统源码(七牛、阿里云 OSS、腾讯云 COS、又拍云、OneDrive)

项目简介&#xff1a; 在现今的网盘服务中&#xff0c;用户经常遭遇限速和价格上涨的问题&#xff0c;这无疑增加了使用上的困扰。 为此&#xff0c;我今天要介绍一款开源且免费的网盘项目——Cloudreve。 这个项目是基于Go语言开发的云存储个人网盘系统&#xff0c;支持多种…

基于 Dockerfile 部署nginx服务(实现HTTPS功能)

目录 前言 1、任务要求 2、建立工作目录并上传nginx安装包 3、创建自签名证书 4、创建 nginx Dockerfile 文件 5、准备并编写 nginx.conf 配置文件 6、准备nginx页面文件 7、工作目录文件结构 8、生成镜像 8、启动容器并开启宿主机端口映射 9、浏览器测试 前言 Ngi…

QT+网络调试助手+TCP客户端

一、网络调试助手UI界面 编程主要思路&#xff1a; 首先将水平的控件 水平布局 &#xff0c;然后相对垂直的控件 垂直布局 &#xff0c;哪怕是底下的groupBox也需要和里面的内容 水平布局&#xff0c;然后最后框选全部 栅格布局。如果需要界面自适应窗口大小&#xff0c…

React 之 主要的内置 Hook(十)

React 重要的主要内置 Hook 包括以下几个&#xff1a; 1. useState 用于在函数组件中添加状态。它返回一个状态变量和一个更新该状态的函数。这使得函数组件能够像类组件一样具有状态。 useState使用代码栗子&#xff1a; import React, { useState } from react; function …

网络工程师必学知识:SSH登录抓包分析报文交互过程

网络工程师必学知识:SSH登录抓包分析报文交互过程 1.概述:2.SSH传输层协议:3.SSH用户认证协议:4.SSH连接协议:5.抓包看看:6.总结:1.概述: SSH(Secure Shell ,安全外壳协议),就是在不安全的协议外层再加一层安全外壳。比如说telnet+SSH=stelnet。 SSH由三个组件构成:…

2023蓝桥杯学习与刷题建议

前两天天给你们组了队&#xff0c;经过两天发现各位都有这样的问题&#xff1a; 不愿意交流。小组不会规划刷题计划。可能是因为没有人带头和具体刷题计划&#xff0c;所以都处于迷茫&#xff0c;不交流、不刷题。还有可能是大家都不认识&#xff0c;都比较羞涩。同时也有我个…

Python vs MATLAB:选择深度学习的首选编程语言

Python vs MATLAB&#xff1a;选择深度学习的首选编程语言 在深度学习领域&#xff0c;编程语言的选择对于初学者的学习路径和未来的职业发展至关重要。目前&#xff0c;Python和MATLAB都是进行科学计算和数据分析的流行工具&#xff0c;但它们在深度学习社区中的应用和受欢迎…