排序算法之希尔排序的C++实现
来源:互联网 发布:910九玩诛仙手游端口 编辑:程序博客网 时间:2024/06/05 00:31
希尔排序其实是直接插入排序的一种优化,不过是增加了一个步长进行分组插入罢了,又称为缩小增量排序。其基本思想:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待gap=1时,再对全体元素进行一次直接插入排序,数组便是有序的了。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比直接插入有较大提高。
按定义直接实现:
void shellsort1(int a[], int n) { int i, j, gap; for (gap = n / 2; gap > 0; gap /= 2) //步长 for (i = 0; i < gap; i++) //直接插入排序 { for (j = i + gap; j < n; j += gap) if (a[j] < a[j - gap]) { int temp = a[j]; int k = j - gap; while (k >= 0 && a[k] > temp) { a[k + gap] = a[k]; k -= gap; } a[k + gap] = temp; } } }很明显,上面的shellsort1代码虽然对直观的理解希尔排序有帮助,但代码量太大了,不够简洁清晰。因此进行下改进和优化,以第二次排序为例,原来是每次从第一个元素开始和后面的进行比较,现在可以改成从第gap个元素开始,与前面的元素比较后再和后面的比较。这种每次从数组第gap个元素开始,每个元素与自己组内的数据进行直接插入排序显然也是正确的。
void shellsort2(int a[], int n) { int j, gap; for (gap = n / 2; gap > 0; gap /= 2) for (j = gap; j < n; j++)//从数组第gap个元素开始 if (a[j] < a[j - gap])//每个元素与自己组内的数据进行直接插入排序 { int temp = a[j]; int k = j - gap; while (k >= 0 && a[k] > temp) { a[k + gap] = a[k]; k -= gap; } a[k + gap] = temp; } }
很明显,改进算法减少了一层for循环,效率得到了提高。
阅读全文
0 0
- 算法实现之希尔排序(C++)
- 排序算法之希尔排序(C语言实现)
- 排序算法之希尔排序(C/C++)
- 排序算法(C实现)------- 希尔排序
- C语言实现排序算法---希尔排序
- 排序算法的C语言实现-希尔排序
- 排序算法之希尔排序 java实现
- 排序算法之希尔排序的思想以及Java实现
- 排序算法之希尔排序的C++实现
- 算法代码实现之希尔排序,C/C++实现
- 排序【2】之希尔排序的C语言实现
- 希尔排序的算法实现
- 希尔排序算法的实现
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 希尔排序算法实现(C++)
- 希尔排序算法实现(C++)
- 【算法】希尔排序C语言实现
- 实现希尔排序算法。
- Oracle自动增长序列
- Java最大的优势真的在于跨平台吗?
- Spring Boot集成swagger
- 【VS应用】 VS.net中快捷键收缩和展开代码段
- TestNG入门相关网站
- 排序算法之希尔排序的C++实现
- 位置和传感器:运动传感器
- php计算时间差,时间比较,时间计算
- webpack的简单使用实现倒计时
- CentOS7安装Scrapy和一些爬虫会用到的服务
- 加解密
- java实现循环单链表
- 闭包详解
- c# 弹出窗体选择文件代码