直接插入排序、希尔排序
直接插入排序、希尔排序
- 一、直接插入排序
- (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. 插入.查找的 ...
- 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)
快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...
- 插入排序--希尔排序
希尔排序,又称为""缩小增量排序"",他的实质是采用分组插入的方法,将整个数组分为几组,从而减少插入排序的数据量,将每组的两端的元素进行比较,然后交换,然后缩小 ...
- 【排序算法】冒泡排序 选择排序 插入排序 希尔排序(数组)
冒泡排序 #include<iostream> using namespace std; #define SWAP(a,b) {int tmp;tmp=a;a=b;b=tmp;} int ...
- 插入排序 希尔排序 C++
最优时间复杂度为o(n),又称缩小增量排序. 逻辑分析: 1.希尔排序首先是确定增量,默认的希尔增量(不一定是最优)为length/2. 2.根据增量分组,将分组的元素利用直接插入法排序. 3.增量= ...
- 插入排序:直接插入排序希尔排序
一.直接插入排序 1. 思想 直接排序法, 可以分为两个部分, 一部分是有序的, 一部分是无序的. 从这个图上, 应该是能看清楚直接插入排序的思想了. 将无序部分的第一个与有序部分进行比较. 从有序部 ...
- 王道八大排序:直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 归并排序 基数排序
文章目录 1.插入排序 1.1直接插入排序 1.2折半插入排序 1.3希尔排序 2.交换排序 2.1冒泡排序 2.2快速排序 3.选择排序 3.1简单选择排序 3.2堆排序 4.归并排序 5.基数排序 ...
- 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树
文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...
最新文章
- Windows下程序打包发布时的小技巧
- NoneBot2插件——进群欢迎
- 京东受冤但不屈,售后服务隐现断崖危机
- 【温故知新】CSS学习笔记(盒子水平居中方法)
- zkdoctor安装部署
- cf1009F. Dominant Indices
- viewController的生命周期
- 【转】一些 SQLite技巧
- MAC编译OpenJDK8:clang: error: include path for libstdc++ headers not found(独家解决办法)
- 小米max2刷android p,小米max2刷LineageOS记录
- 数字化中台前导--企业架构TOGAF简介
- ManualResetEvent类的用法
- Ubuntu20.04安装C++版Opencv4
- 水香木鱼书写PPT总结
- c语言程序如何在keil中运行,keil c51中C程序的启动过程
- android ping 网络延迟
- 基于大数据风控技术,PBOC二代人行征信报告的解读哪家好
- 侏罗纪世界手游显示无法登陆到服务器,侏罗纪世界手游闪退怎么办 游戏闪退解决方法...
- 01-死磕QNX someip
- wps使用xml文件显示ui