菜鸟学习历程【15-2】希尔排序
来源:互联网 发布:淘宝上的全球购物流 编辑:程序博客网 时间:2024/06/01 08:30
2.希尔排序
希尔排序,也叫做减小增量排序,过程大致如下:(一般情况下,我们习惯上第一次遍历将数组长度length/2 作为一次遍历的步长)
以数组a[] = {35, 27, 17, 22, 5, 25, 18, 40, 9, 11}为例;
1.取数组长度(length/2)作为第一次遍历的步长,对每一组进行直接插入排序:
2.取上一次步长的一半 ,即 5/2 = 2为步长,将每一组进行直接插入排序:
3.取上一次步长的一半,即2/2 = 1为步长,进行一次直接插入排序;
这三步执行完毕后,数组已经按照从小到大排序了,那么有人会有疑惑,既然希尔排序的最后一次遍历就是对整个数组进行直接插入排序,那我们为什么还要用希尔排序呢?
有耐心的同学可以自己写一个乱序的数组,然后对它分别进行希尔排序和直接插入排序的步骤分解,会发现希尔排序执行的次数要少于直接插入排序,就是说希尔排序的效率高于直接插入排序。
下面附上代码:
#include <stdio.h>void ShellSort(int arr[], int len){ int i, j, tmp, gap; for(gap = len / 2 ; gap > 0; gap /= 2) { for(i = gap; i < len; i++) { tmp = arr[i]; for(j = i - gap; j >= 0 && arr[j] > tmp; j -= gap) { arr[j+gap] = arr[j] } arr[j+gap] = tmp; } }}int main(){ int i, length; int a[] = {35, 27, 17, 22, 5, 25, 18, 40, 9, 11}; length = sizeof(a) / sizeof(a[0]); ShellSort(a, length); for(i = 0; i < length ; i++) { printf("%d ", a[i]); } return 0;}
看完代码,熟悉直接插入排序的同学,可以发现希尔排序就是在直接插入排序外部插入了一层循环,用来控制步长。
阅读全文
1 0
- 菜鸟学习历程【15-2】希尔排序
- 菜鸟学习历程【15-3】快速排序
- 菜鸟学习历程【15-4】冒泡排序
- 菜鸟学习历程【15-6】堆排序、归并排序
- 菜鸟学习历程【15-1】直接插入排序
- 菜鸟学习历程【15-5】简单选择排序
- 菜鸟学排序----希尔排序
- c sharp 菜鸟的学习历程2
- 菜鸟成长之希尔排序
- Java学习-插入排序2-希尔排序
- Android菜鸟历程2
- 菜鸟之计算机学习历程
- java菜鸟的学习历程
- C_sharp:一个菜鸟学习历程
- 菜鸟学习历程【11】数据结构
- 菜鸟学习历程【12】链表
- 菜鸟学习历程【21】线程
- 希尔排序学习笔记
- 机器学习鉴定《鬼吹灯1-4》是不是天下霸唱所写
- easyui--5.DataGrid
- 缓存穿透与缓存雪崩
- usaco Subset Sums
- 必应终于把首页的图片替掉了。
- 菜鸟学习历程【15-2】希尔排序
- 机器学习理论与实践系列(1)-分类算法
- 常用的几种sql查询语句
- 机器学习判定红楼梦后40回是否曹雪芹所写
- shell中的多进程【并发】
- A
- 一中OJ #1735 藏宝图 | 棋盘Multi_SSP 多源最短路径 BFS | 解题报告
- xXx图片助手 V2.0 ---新一代的装B神器
- map的遍历方式