直接插入排序、希尔排序

  • 一、直接插入排序
    • (1)主要思想
    • (2)代码实现
    • (3)性能分析
  • 二、希尔排序
    • (1)主要思想
    • (2)代码实现
    • (3)性能分析

一、直接插入排序

直接插入排序类似于我们平时玩扑克牌,假如一个人玩牌喜欢将排从左往右依次是从小到大排列,拿一张排一张,这样的思想就是直接插入排序。

(1)主要思想

(2)代码实现

#include<stdio.h>
#include<assert.h>
void InsertSort(int arr[], int len)
{assert(arr!=NULL);int i = 0, j = 0;for (i = 1; i < len;i++){int tmp = arr[i];for (j = i - 1; j >= 0; j--){if (arr[j] > tmp){arr[j + 1] = arr[j];}else{break;}}arr[j + 1] = tmp;}
}void Show(int arr[], int len)
{for (int i = 0; i < len; i++){printf("%d  ", arr[i]);}
}int main()
{int arr[] = { 90,67,2,4,534,56,23,56 };int len = sizeof(arr) / sizeof(arr[0]);InsertSort(arr, len);Show(arr, len);
}

运行结果:

(3)性能分析

  • 算法特点:数据越有序,效率越高。
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)
  • 稳定性:稳定

二、希尔排序

希尔排序是在直接插入排序的基础上降低时间复杂度的一种算法,它用到的基本方法还是直接插入排序,但是将一组数据分为多组进行排序,再进行合并再排序,有效的降低了算法的时间复杂度。

(1)主要思想


分组之后能让数据越来越有序,但是我们应该怎么分组呢?

一般来说,分的组要互素。

(2)代码实现

#include <stdio.h>
#include<assert.h>
void ShellSort(int ar[], int len)//对数据进行分组;
{assert(ar!=NULL);int arr[] = { 5,3,1 };for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++){Shell(ar,len,arr[i]);}
}void Shell(int ar[], int len, int pos)
{int j = 0, i = 0, tmp = 0;for (i = pos; i < len; i++){tmp = ar[i];for (j = i - pos; j >= 0; j-=pos){if (ar[j] > tmp){ar[j + pos] = ar[j];}else{break;}}ar[j + pos] = tmp;}
}int main()
{int brr[] = { 23,52,24,36,59,87,56,83,100,1000,234,3,124,357,7 };int len = sizeof(brr) / sizeof(brr[0]);ShellSort(brr, len);Show(brr, len);
}

运行结果:

(3)性能分析

  • 时间复杂度:至今有多种说法,但是绝对比直接插入排序节省时间。
  • 空间复杂度:O(1)
  • 稳定性:有跳跃交换数据,不稳定。

直接插入排序、希尔排序相关推荐

  1. 【排序算法】冒泡排序|选择排序|插入排序|希尔排序

    文章目录 冒泡排序 选择排序 插入排序 希尔排序 冒泡排序   第一个元素开始向第二个元素比较,若大于则交换位置,不大于则不动.然后第二个元素和第三个元素比较,再然后第三个元素和第四个元素比较-一直比 ...

  2. 直接插入排序 希尔排序 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 基数排序的算法分析和具体实现 ...

    排序分为内部排序和外部排序 内部排序是把待排数据元素全部调入内存中进行的排序. 外部排序是因数量太大,把数据元素分批导入内存,排好序后再分批导出到磁盘和磁带外存介质上的排序方法. 比较排序算法优劣的标 ...

  3. 插入排序(折半查找优化插入排序||希尔排序) _清风明月

    插入排序:插入排序分为三个步骤: 1. 找位置.(序列可分为两个部分,第一个部分是有序序列,其二是非有序序列.当为有序序列时,查找可以改进为折半查找,优化算法速度.) 2. 移动. 3. 插入.查找的 ...

  4. 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...

  5. 插入排序--希尔排序

    希尔排序,又称为""缩小增量排序"",他的实质是采用分组插入的方法,将整个数组分为几组,从而减少插入排序的数据量,将每组的两端的元素进行比较,然后交换,然后缩小 ...

  6. 【排序算法】冒泡排序 选择排序 插入排序 希尔排序(数组)

    冒泡排序 #include<iostream> using namespace std; #define SWAP(a,b) {int tmp;tmp=a;a=b;b=tmp;} int ...

  7. 插入排序 希尔排序 C++

    最优时间复杂度为o(n),又称缩小增量排序. 逻辑分析: 1.希尔排序首先是确定增量,默认的希尔增量(不一定是最优)为length/2. 2.根据增量分组,将分组的元素利用直接插入法排序. 3.增量= ...

  8. 插入排序:直接插入排序希尔排序

    一.直接插入排序 1. 思想 直接排序法, 可以分为两个部分, 一部分是有序的, 一部分是无序的. 从这个图上, 应该是能看清楚直接插入排序的思想了. 将无序部分的第一个与有序部分进行比较. 从有序部 ...

  9. 王道八大排序:直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 归并排序 基数排序

    文章目录 1.插入排序 1.1直接插入排序 1.2折半插入排序 1.3希尔排序 2.交换排序 2.1冒泡排序 2.2快速排序 3.选择排序 3.1简单选择排序 3.2堆排序 4.归并排序 5.基数排序 ...

  10. 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树

    文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...

最新文章

  1. Windows下程序打包发布时的小技巧
  2. NoneBot2插件——进群欢迎
  3. 京东受冤但不屈,售后服务隐现断崖危机
  4. 【温故知新】CSS学习笔记(盒子水平居中方法)
  5. zkdoctor安装部署
  6. cf1009F. Dominant Indices
  7. viewController的生命周期
  8. 【转】一些 SQLite技巧
  9. MAC编译OpenJDK8:clang: error: include path for libstdc++ headers not found(独家解决办法)
  10. 小米max2刷android p,小米max2刷LineageOS记录
  11. 数字化中台前导--企业架构TOGAF简介
  12. ManualResetEvent类的用法
  13. Ubuntu20.04安装C++版Opencv4
  14. 水香木鱼书写PPT总结
  15. c语言程序如何在keil中运行,keil c51中C程序的启动过程
  16. android ping 网络延迟
  17. 基于大数据风控技术,PBOC二代人行征信报告的解读哪家好
  18. 侏罗纪世界手游显示无法登陆到服务器,侏罗纪世界手游闪退怎么办 游戏闪退解决方法...
  19. 01-死磕QNX someip
  20. wps使用xml文件显示ui

热门文章

  1. Charles抓包实战详解
  2. 考题:正则表达式 .*? 和 .* 有区别吗?
  3. PWA即将推向所有Chrome平台
  4. C 标准库 - ctype.h
  5. Vue.js用法详解(一)更新中~
  6. Latex中设置字体颜色
  7. 微信小程序架构分析 (上)
  8. 记录 android 开发的一个 面试 问题
  9. Sql Server之旅——第十四站 深入的探讨锁机制
  10. [Android1.5]Android2.0版本以下Activity切换动画效果