算法:希尔排序
2017-03-28 21:11
148 查看
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
Shell排序的思想:
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
代码如下:
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
Shell排序的思想:
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
代码如下:
#include <iostream> #include <cassert> using namespace std; void shell_sort(int *arr,int n); void shell_sort(int *arr,int n) { assert(arr); int gap,i,j,temp; gap = n /2; for(gap; gap > 0;gap /=2) for(j = gap; j < n; j++) { if(arr[j] < arr[j - gap]) { temp = arr[j]; int k ; for(k = j - gap ;k >=0 && arr[k ] > temp; k-=gap ) arr[k+gap] = arr[k]; arr[k+gap] = temp; } } } int main() { int a[5] = {4,6,2,8,1}; shell_sort(a,5); int i = 0; for(i = 0;i < 5; i ++) cout << " " << a[i] << " "; cout <<endl; }
相关文章推荐
- 八大种必知排序算法(二) 选择排序,插入排序,希尔算法(续)
- Java 选择排序、插入排序、希尔算法实例详解
- 算法--排序--希尔
- java必须知道的八大种排序算法:冒泡排序、 选择排序、插入排序、快速排序、希尔算法、归并排序算法、基数排序、堆排序算法
- C 语言算法排序 希尔
- 算法学习--希尔和快速排序
- 必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】
- 排序算法之希尔(优化冒泡)排序
- 算法--排序(希尔,归并)
- 数据结构-排序算法之插入排序(直接插入,二分插入,希尔,表插入)
- 【java排序】 选择排序,插入排序,希尔算法
- 算法——希尔插入排序
- 必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】
- Java实现的排序算法及比较 [冒泡,选择,插入,归并,希尔,快排]
- c# 排序 算法 函数 冒泡 选择 插入 希尔
- 无聊时总结总结算法之02排序(直接插入+希尔)
- 必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】
- 八大种必知排序算法(二) 选择排序,插入排序,希尔算法
- 无聊时总结总结算法之02排序(希尔 完结)
- 【坐在马桶上看算法】排序总结:小哼买书 推荐