插入排序专题 直接插入 折半 希尔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 ...
随机推荐
- JAVA多线程的问题以及处理(二)【转】
使用互斥解决多线程问题是一种简单有效的解决办法,但是由于该方法比较简单,所以只能解决一些基本的问题,对于复杂的问题就无法解决了. 解 决多线程问题的另外一种思路是同步.同步是另外一种解决问题的思路,结 ...
- SQLSERVER查询数据库死锁的存储过程
USE [IdentityDemo] GO /****** Object: StoredProcedure [dbo].[sp_who_lock] Script Date: 2019/1/17 10: ...
- SQL Server 日常维护经典应用
SQL Server日常维护常用的一些脚本整理. 1.sql server开启clr权限: GO RECONFIGURE GO ALTER DATABASE HWMESTC SET TRUSTWORT ...
- 深入学习SpringMVC以及学习总结
一.优点: 1.SpringMVC简化web程序开发; 2.SpringMVC效率很好(单例模式): 3.SpringMVC提供了大量扩展点,方便程序员自定义功能: ①.DispatcherServl ...
- JAVA API的下载和中文查看API
一.JAVA API的下载 1.1 JAVA由SUN公司开发,2006年SUN公司宣布将Java技术作为免费软件对外发布,标志着JAVA的公开免费.2009年,SUN公司被甲骨文公司收购,因此我们现在 ...
- Microsoft SQL Server sa 账户 登录错误18456
分析:在安装Sql server 2012的时候,服务器身份验证没有选择“SQL Server 和 Windows身份验证模式(S)”,导致SQL Server身份验证方式被禁用. 操作: 以Wind ...
- JavaScript -- 时光流逝(一):数据类型,变量,类型转换,函数
JavaScript -- 知识点回顾篇(一):数据类型,变量,类型转换,函数 1. 数据类型 Boolean:值类型,布尔(逻辑)只能有两个值:true 或 false. Number:值类型,Ja ...
- JSP内置对象概述
JSP内置对象预先定义了九个这个的对象: request(请求) . response (响应). session (会话). application (应用程序). out . pageContex ...
- Django-rest-framework 接口实现 认证:(auth | authentication)
认证:(auth | authentication) REST framework提供了一些开箱即用的身份验证方案,并且还允许你实现自定义方案. 在 rest_framework.authentica ...
- python 列表 元祖
# # 1,写代码,有如下列列表,按照要求实现每⼀一个功能li = ["alex", "WuSir", "ritian", "ba ...