插入排序专题 直接插入 折半 希尔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/c++求解图的关键路径 critical path
c/c++求解图的关键路径 critical path 上图表示一个工程,工程以V1为起始子工程,V9为终止子工程. 由图可以看出,要开工V5工程,必须在完成工程V2和V3后才可以. 完成V2需要a1 ...
- linux shell 指令 诸如-d, -f, -e之类的判断表达式简介
一.文件比较运算符 1. e filename 如果 filename存在,则为真 如: [ -e /var/log/syslog ] 2. -d filename 如果 filename为目录,则为 ...
- 一、Selenium 工作原理
1.Selenium介绍 Selenium是用于测试Web应用程序用户界面UI的常用框架.端对端的功能测试.并且在一个多个浏览器中操作. 目前Seienium 组件主要包括Selenium IDE ...
- C# -- 使用Aspose.Cells创建和读取Excel文件
使用Aspose.Cells创建和读取Excel文件 1. 创建Excel Aspose.Cells.License li = new Aspose.Cells.License(); li.SetLi ...
- react 之 reflux 填坑
注意:老铁些,在看这篇文章的之前,最好了解一下react 的全局状态管理库哦,不然可能会坐飞机. ^_^ React 之reflux (它是一个功能模块,需要安装引入): import Reflux ...
- Linux 小知识翻译 - 「补丁」(patch)
这次,聊聊补丁. 当有bug或者安全漏洞的时候,就会发布补丁.打上补丁之后,就能解决相应的bug或者安全漏洞. 那么,「补丁」到底是什么呢? 「补丁」只有少量的代码,一般都是对程序的一部分进行更新或者 ...
- Eclipse JVM terminated.exit code=13
今天,在安装Nomad PIM时碰到这个问题,因为这个应用是基于32位的Eclipse平台开发的,而我的电脑是64位的Windows 7,当然安装的JDK也是64位的,于是报错. 搜索了网上,给了许多 ...
- 模拟placeholder
把这个记下来,主要是因为这里的 defaultValue 我之前竟然不知道 <input type="text" value="提示内容" onFocus ...
- Java面试知识点之数据库篇(一)
前言:数据库的相关知识,在面试中也经常出现,笔者认为非常有必要对此类知识进行相关总结. 1.索引 索引是对数据库表中一列或多列的值进行排序的结构,是帮助数据库高效获取数据的数据结构. 通俗理解:索引就 ...
- UVA1616-Caravan Robbers(枚举)
Problem UVA1616-Caravan Robbers Accept: 160 Submit: 1156Time Limit: 3000 mSec Problem Description O ...