八大种必知排序算法(二) 选择排序,插入排序,希尔算法(续)
来源:互联网 发布:离散傅里叶矩阵 编辑:程序博客网 时间:2024/05/01 09:51
三、希尔算法
1、基本思想:
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
2、操作方法:
选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
按增量序列个数k,对序列进行k 趟排序;
每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
希尔排序的示例:
3、算法实现:
/**希尔排序的原理:根据需求,如果你想要结果从大到小排列,它会首先将数组进行分组,然后将较大值移到前面,较小值
* 移到后面,最后将整个数组进行插入排序,这样比起一开始就用插入排序减少了数据交换和移动的次数,可以说希尔排序是加强
* 版的插入排序
* 拿数组5, 2, 8, 9, 1, 3,4来说,数组长度为7,当increment为3时,数组分为两个序列
* 5,2,8和9,1,3,4,第一次排序,9和5比较,1和2比较,3和8比较,4和比其下标值小increment的数组值相比较
* 此例子是按照从大到小排列,所以大的会排在前面,第一次排序后数组为9, 2, 8, 5, 1, 3,4
* 第一次后increment的值变为3/2=1,此时对数组进行插入排序,
*实现数组从大到小排
*/
public static void shellSort(int[] data)
{
int j = 0;
int temp = 0;
//每次将步长缩短为原来的一半
for (int increment = data.length / 2; increment > 0; increment /= 2)
{
for (int i = increment; i < data.length; i++)
{
temp = data[i];
for (j = i; j >= increment; j -= increment)
{
if(temp > data[j - increment])//如想从小到大排只需修改这里
{
data[j] = data[j - increment];
}
else
{
break;
}
}
data[j] = temp;
}
}
}
4、效率
时间复杂度:O(n^2).
4、各种算法的时间复杂度
- 八大种必知排序算法(二) 选择排序,插入排序,希尔算法(续)
- 八大种必知排序算法(二) 选择排序,插入排序,希尔算法
- 八大排序算法之(二)插入排序 希尔排序
- 八大排序算法(二)希尔排序
- 必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】
- 初级排序算法(选择排序、插入排序、希尔排序)
- 五、排序算法(选择排序、插入排序、希尔排序)
- 算法系列(二)冒泡排序、选择排序、插入排序和希尔排序(Java实现)
- 八大排序算法之二希尔排序(C语言)
- 八大排序算法总结之一(冒泡排序,快速排序,直接插入排序,希尔排序)
- 八大排序算法总结之一(冒泡排序,快速排序,直接插入排序,希尔排序)
- 八大排序算法(2) 希尔排序
- 常见排序算法整理(二)----希尔排序,选择排序
- 基本排序算法(选择、插入、冒泡)和希尔排序
- 八大排序算法(二) 折半插入排序
- 排序算法(1):插入排序,选择排序,希尔排序,堆排序
- 八大排序算法-希尔排序
- 八大排序算法 之 希尔排序(缩小增量排序)
- EJS 模板快速入门
- CCF 窗口
- Object类中的方法介绍
- gitlab的使用
- MySql取得日期(前一天、某一天)
- 八大种必知排序算法(二) 选择排序,插入排序,希尔算法(续)
- IIS不能对网站添加默认文档(由于权限不足而无法写入配置文件)
- java.lang.NoClassDefFoundError: Could not initialize class net.sf.json.JSONArray
- Gtest学习笔记1.2
- switch/case语句支持的数据类型
- HDU - 4756 Install Air Conditioning(树形DP + 最小生成树)
- oracle转mysql注意的问题
- git 在开发中程序员最基本最有用的几步
- android开发第一弹--androidStudio常用操作笔记