插入排序专题 直接插入 折半 希尔shell
1.直接插入排序
分析:a[n]有n个元素 a[0...n-1] 从 i=1...n-1 a[i]依次与 a[0...n-2]数字进行比较
发现后面的数字大于前面的数字交换位置,每一次比较,与前面的数字x比较,小于等于x的话往前推a[j]=a[j+1],当大于a[j]时候 a[j+1]=a[i]插入
//插入排序
#include<iostream>
using namespace std;
void gcd(int a[],int start,int end){
int tmp;
int i,j;
//从第二个元素开始i=1---n-1
for(i=start+;i<end;i++){
tmp=a[i];
for(j=i-;tmp<a[j]&&j>=start;j--){
a[j+]=a[j];
}
a[j+]=tmp;
}
}
int main()
{
int n;
cin>>n;
int a[n];
for(int i=;i<n;i++) cin>>a[i];
gcd(a,,n);
for(int i=;i<n;i++) cout<<a[i]<<" ";
}
2.折半插入排序:在插入排序寻找位置改成折半查找
针对a[i],查找出a[j],使a[j]<=a[i],对a[j]之后的数字全部移动a[j]=a[j+1],a[i]插入到a[j]之后,
//插入排序
#include<iostream>
using namespace std;
void gcd(int a[],int start,int end){
int tmp;
int i,j,right,left,mid;
for(i=start+;i<end;i++){
tmp=a[i];
left=start;
right=i-;
while(left<=right){
mid=(left+right)/;
if(tmp<a[mid])
right=mid-;
else left=mid+;
// for(j=i-1;j>=left;j--) a[j+1]=a[j];
}
for(j=i-;j>=left;j--) a[j+]=a[j];
a[left]=tmp;
}
}
int main()
{
int n;
cin>>n;
int a[n];
for(int i=;i<n;i++) cin>>a[i];
gcd(a,,n);
for(int i=;i<n;i++) cout<<a[i]<<" ";
}
3.希尔shell插入排序
a.由于直接插入排序算法简单,在n很小的时候效率比较高,
b.正序越多,效率越高
#include<iostream>
using namespace std;
void shell(int a[],int start,int end,int gap){
int tmp;
int i,j;
for(i=start+gap;i<end;i++){//每gap段比较
tmp=a[i];
for(j=i-gap;tmp<a[j]&&j>=start;j-=gap) a[j+gap]=a[j];
a[j+gap]=tmp;
}
}
void gcd(int a[],int start,int end){
int gap=end-start;
while(gap>){
gap=gap/+;
shell(a,start,end,gap);
}
}
int main()
{
int n;
cin>>n;
int a[n];
for(int i=;i<n;i++) cin>>a[i];
gcd(a,,n);
for(int i=;i<n;i++) cout<<a[i]<<" ";
}
插入排序专题 直接插入 折半 希尔shell的更多相关文章
- ZT 二分插入排序也称折半插入排序
二分插入排序也称折半插入排序,基本思想是:设数列[0....n]分为两部分一部分是[0...i]为有序序列,另一部分是[i+1.....n]为无序序列,从无序序列中取一个数 x ,利用二分查找算法找到 ...
- 插入排序(直接插入、折半、Shell)
直接插入排序(顺序插入排序) 基本思想: 排序过程,整个排序过程为n-1趟插入,即先将序列中的第1个元素看成是一个有序子序列,然后从第2个元素开始,逐个进行插入,直至整个序列有序. 在有序序列中插入一 ...
- 插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)
插入排序算法主要分为:直接插入算法,折半排序算法(二分插入算法),希尔排序算法,后两种是直接插入算法的改良.因此直接插入算法是基础,这里先进行直接插入算法的分析与编码. 直接插入算法的排序思想:假设有 ...
- 排序(4)---------希尔(shell)排序(C语言实现)
由于考试耽搁了几天,不好意思~~~ 前面的介绍的三种排序算法,都属于简单排序,大家能够看下详细算法,时间复杂度基本都在0(n^2),这样呢,非常多计算机界.数学界的牛人就非常不爽了,他们在家里想啊想, ...
- 希尔shell排序——java实现
希尔排序是对插入排序的优化,将插入排序的交换步长由1增加到h. 希尔排序的思想是使数组中任意间隔为h的元素有序.步长调幅为h = 3*h + 1, 也就是1,4,13,40,121,364, 1003 ...
- Java排序算法之希尔(Shell)排序
基本思想: 希尔排序就是对直接插入排序的一个优化.现在有一个array,希尔排序就是设定一个增量incrementNum(0<incrementNum<array.length).先从ar ...
- 插入排序的优化非希尔【不靠谱地讲可以优化到O(nlogn)】 USACO 丑数
首先我们先介绍一下普通的插排,就是我们现在一般写的那种,效率是O(n^2)的. 普通的插排基于的思想就是找位置,然后插入进去,其他在它后面的元素全部后移,下面是普通插排的代码: #include< ...
- 4.7 希尔(shell)排序法
4-7 ShellSort.c #include <stdio.h> #include "4-1 CreateData.c" //生成随机数的函数 #define AR ...
- 新年在家学java之基础篇--循环&数组
因为“野味肺炎”的肆虐,过年被迫宅家只能吃了睡.睡了吃.这么下次只能长膘脑子空空,不如趁此机会重新学习java基础,为日后做铺垫~ 循环结构: 几种循环:for(::),while(){},do{}w ...
随机推荐
- C#面向对象 1
using System; using System.Collections.Generic; using System.Collections; using System.Linq; using S ...
- sql-server的添加数据库文件(日志数据)以及收缩数据库文件(日志数据)
环境: SSMS sql-server2016 一.为数据库添加数据文件 添加日志数据文件 以下是添加数据文件和日志文件的代码 ALTER DATABASE [joinbest] ADD FILE ( ...
- Lua保留指定小数位数
默认会四舍五入 比如:%0.2f 会四舍五入后,保留小数点后2位 print(string.format("%.1f",0.26)) ---会输出0.3,而不是0.2 Lua保留一 ...
- Node 各个版本支持ES2015特性的网站
如果想了解Node 各个版本支持ES2015到那个程度,可以看下面网站. https://node.green/
- 利用Python通过频谱分析和KNN完成iphone拨号的语音识别
最近这段时间,学校里的事情实在太多了,从七月下旬一直到八月底实验室里基本天天十二点或者通宵,实在是没有精力和时间来写博客.这周老师出国开会,也算有了一个短暂的休息机会,刚好写点有意思的东西. 上周在天 ...
- About Swift
Swift is a new programming language for iOS and OS X apps that builds on the best of C and Objective ...
- 关于CUDA,cuDNN,TF,CUDA驱动版本兼容问题
实际工作当中,经常维护好几个项目的代码,不同项目依赖的TF版本不一致问题.网上找了好多资料,但是每次遇到的问题都不一样,每次都要去查(就是是一样的问题,解决办法也可能会不一样)每次踩坑无数,今天痛定思 ...
- 解决y7000笔记本ubuntu18.04下 休眠挂起后唤醒花屏
定位问题,切换到核显后发现一点问题也没有,基本确定是显卡驱动的问题 但是由于配置环境比较复杂,不想重新装N卡驱动,所以另寻方法 sudo gedit /etc/default/grub 修改前 # I ...
- 转://Oracle A用户给B用户授权查询指定表或视图权限方案
用DNINMSV31账户登录数据库进行如下操作: CREATE USER NORTHBOUND IDENTIFIED BY NORTHBOUND DEFAULT TABLESPACE "TB ...
- 【转】编写微信聊天机器人4《聊天精灵WeChatGenius》:实时获取到微信聊天消息,hook数据库插入操作。
接上篇,使用Xposed来hook微信,找到微信进程:https://blog.csdn.net/weixin_42127613/article/details/81839537 既然已经找到了微信进 ...