插入排序:插入排序分为三个步骤:
1. 找位置。(序列可分为两个部分,第一个部分是有序序列,其二是非有序序列。当为有序序列时,查找可以改进为折半查找,优化算法速度。)
2. 移动。
3. 插入。查找的折半查找:(基于已经有序的序列:升序)
while(low>=high)时
low________mid________high
low=0      key        high=length-1
如果key值(目前需要比较的值)比mid值小,则查找左半部分,high=mid-1
反之,比mid值大,则查找右半部分,low=mid+1优化可用希尔排序进行排序
希尔排序,从第一个开始,每到第x个,就打上标记,以间隔为x的元素进行比较,可进行多次比较。
x=5.
49  38  65  97  76  13  27  49  55  04
*    &  ^            *  &   ^
希尔排序的x,将被统一存入一个一维数组进行调用,but最后的间隔必须为1,也就是插入排序。
使用希尔排序的算法,可以类似于把区间进行整齐的区域划分(这里跟归并排序的思想有点相似。),希尔排序作用:防止最坏可能调用原始插入排序的时间复杂度。1.插入排序
自拟题目格式:
输入:
一共T组数据。
每组数据,n个需要排序的数。n<=100;
排序按照升序进行排序。
实验数据:
2
5
11 32 22 58 96
4
3 4 5 12. 折半查找
自拟题目格式:
输入:
一共T组数据。
每组数据,n个需要排序的数。n<=100;
排序按照升序进行排序。
实验数据:
2
5
11 32 22 58 96
4
3 4 5 13. 希尔排序
自拟题目格式:
输入:
一共T组数据。
每组数据,t个不同值的间隔x1,xt;
每组数据,n个需要排序的数。n<=100;
排序按照升序进行排序。
实验数据:
3
3 5
5 2 1
11 32 22 58 96
3 4
5 2 1
3 4 5 1
3 10
49 38 65 97 76 13 27 49 55 04插入排序代码:
#include"stdafx.h"
#include<iostream>
using namespace std;
int main()
{
int T, n, i, j, a[105], k;
cin >> T;
while (T--)
{
cin >> n;
for (i = 0; i < n; ++i)
cin >> a[i];
for (i = 1; i < n; ++i)
for (j = 0; j < i; ++j)
{
if (a[i] < a[j])
{
int key = a[i];//1
for (k = i - 1; k >= j; --k)
a[k + 1] = a[k];//5//4//3
a[k+1] = key;//1
}
}
for (i = 0; i < n; ++i)
cout << a[i] << " ";
cout << endl;
}
return 0;
}插入排序折半查找优化代码:
//折半查找
int main()
{
int T, n, a[105], i, j, low, high, mid = 0;
cin >> T;
while (T--)
{
cin >> n;
for (i = 0; i < n; ++i)
cin >> a[i];
for (i = 1; i < n; ++i)//a[i]是要查找的数。
{
high = i - 1, low = 0;
while (low <= high)
{
mid = (low + high) / 2;
if (a[i] < a[mid])
high = mid - 1;
else
low = mid + 1;
}
if (a[i] < a[mid])
{
int key = a[i];//1
for (j = i - 1; j >= mid; --j)
a[j + 1] = a[j];//5//4//3
a[j + 1] = key;//1
}
}
for (i = 0; i < n; ++i)
cout << a[i] << " ";
cout<<endl;
}
return 0;
}插入排序希尔排序优化代码:
int main()
{
int T, t, n, i, j, k, l, a[105], xier[5];
cin >> T;
while (T--)
{
cin >> t >> n;
for (i = 0; i < t; ++i)
cin >> xier[i];
for (i = 0; i < n; ++i)
cin >> a[i];
for (l = 0; l < t; ++l)
{
for (i = xier[l]; i < n; i += xier[l])//a[i]是要查找的数。
for (j = 0; j < i; j += xier[l])
{
if (a[i] < a[j])
{
int key = a[i];//1
for (k = i - xier[l]; k >= j; k -= xier[l])
a[k + xier[l]] = a[k];//5//4//3
a[k + xier[l]] = key;//1
}
}
}
for (i = 0; i < n; ++i)
cout << a[i] << " ";
cout << endl;
}
return 0;
}

插入排序(折半查找优化插入排序||希尔排序) _清风明月相关推荐

  1. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  2. ds排序--希尔排序_图解直接插入排序和希尔排序

    前言 这次我们介绍插入类排序中的 直接插入排序 和 希尔排序 . 对于直接插入排序,虽然它的时间复杂度也是 O(n^2) ,但是在元素 有序或近乎有序 的情况下,时间复杂度可以降为 O(n) ,效率比 ...

  3. ds排序--希尔排序_排序算法 - 希尔排序分析及优化

    希尔排序 1 算法思想 希尔排序,也被称为递减增量排序,是简单插入排序的一种改进版本. 在插入排序中,如果待排序列中的某个元素,距离有序数列中待插入位置非常远,就需要比较很多次才可以到达插入位置,这是 ...

  4. python实现希尔排序_希尔排序算法的python实现

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. def shellSort(items): inc = len(items) / 2 wh ...

  5. 【数据结构与算法】内部排序之一:插入排序和希尔排序的N中实现(不断优化,附完整源码)...

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/20043459   前言 本来想将所有的内部排序总结为一篇博文,但是随着研究的深入,还是放弃 ...

  6. python实现希尔排序算法_排序算法总结(冒泡排序、直接插入排序、希尔排序)(python实现)...

    其实本文叫排序算法总结有点过了,只是用python实现了一遍.本文都是参照一篇csdn博客<数据结构排序算法>,里面详细介绍每种排序算法的原理,并给出了C++的实现,再次膜拜. # -*- ...

  7. 【Java】插入排序、希尔排序详解

    文章目录 1️⃣必备排序常识 2️⃣插入排序 1.直接插入排序 2.优化后的插入排序 3.折半插入排序 4.性能比较 3️⃣希尔排序 性能比较 1️⃣必备排序常识 稳定性:在原序列中,r[i]=r[j ...

  8. 十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序

    文章目录 一.冒泡排序 1.1 冒泡排序基础[必会知识] 1.2 冒泡排序优化 1.2.1 外循环优化 1.2.2 内循环优化 1.2.3 双向遍历 1.3 冒泡排序的稳定性.复杂度和适用场景 1.3 ...

  9. 九大经典算法之插入排序、希尔排序

    01 插入排序(Insertion Sort) 原理:每次选择一个元素,并且将这个元素和整个数组中的所有元素进行比较,然后插入到合适的位置. void insertion_sort(int arr[] ...

最新文章

  1. 13岁小孩都跟我抢Python了,完了!
  2. Linux中apt-get update和apt-get upgrade命令的区别
  3. 应用服务器与数据库之间是长连接,要接收多个 tcp 长连接不断发送的数据并存储,哪些数据库或数据存储方案比较合适?...
  4. 【Solr】 solr对拼音搜索和拼音首字母搜索的支持
  5. django-中间件
  6. 软件测试中的存根程序
  7. php smarty分页原理,SMARTY分页详解
  8. weblogic部署,常见错误解决——Unmarshaller failed
  9. 五、扩展Orchard(五) Writing a Content Part
  10. 自动驾驶落地物流场景,嬴彻科技驶入快车道
  11. mapxtreme相关
  12. js判断是否微信浏览器
  13. 前后端交互、Node、npm、Express、mysql基础
  14. linux cpu使用率 理解,深入理解Linux的CPU使用率
  15. matlab中zeta函数,黎曼zeta函数是什么,具体点
  16. Thinkphp 5.0 仿百度糯米开发多商家电商平台
  17. oracle-DDL对表的操作
  18. matlab图像雅可比行列式,函数矩阵与行列式(雅可比(Jacobi)矩阵与行列式)雅克...-雅可比矩阵-数学-詹底巧同学...
  19. JavaScript代码在哪里放置?
  20. 一块钱可以拿到一包加拿大西洋参 一块钱可以拿到一盒50g正韩一宫庄高丽参 一块钱可以拿到一套保鲜扣扣 一块钱能拿到一盒一宫庄鹿茸 可以去哪里拿? 看在我们的情分上告送你 可以加微**信188 247

热门文章

  1. 中国水处理剂行业需求状况分析及十四五前景预测报告2021年版
  2. 华为nova5i pro鸿蒙,关晓彤又要用nova 5i Pro来成都搞事情了?
  3. java线程学习(二):线程池
  4. java二嗨租车项目_Java入门第二季 项目实战 达达租车系统代码实现
  5. ubuntu下用xchat连接freenode的IRC
  6. 新品上市调查方案(2)-产品测试目的
  7. 如何格式化字符串的xml?
  8. 鲸鱼优化算法优化BP神经网络回归预测的算法设计-附代码
  9. 关于select2禁止选择的问题
  10. select2 api 使用教程(全)