直接插入排序与希尔排序
来源:互联网 发布:网络语cbd女生 编辑:程序博客网 时间:2024/06/05 17:01
1.直接插入排序
首先我们来看直接插入排序:
直接插入排序就是一个将无序区的内容向有序区放的一个过程,有序区不断地变大,无序区不断的变小,这样最后全部变为有序,就完成了直接插入排序的过程了。
适用情况:把新的数据插入到已经排好的数据列中。
算法步骤:
1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
示例代码:
public class StraightInsertionSort {public static void main(String[] args) {int a[] = { 2, 4, 1, 6, 3, 8 };new StraightInsertionSort().insertionSort(a);System.out.println(Arrays.toString(a));}void insertionSort(int a[]) {int j;for (int i = 1; i < a.length; i++) {//首先设定插入次数,即循环次数,1个数的那次不用int temp = a[i]; // 插入数放入临时变量for (j = i - 1; j >= 0 && temp < a[j]; j--) {// 与前面排好序的数依次比较,若小于a[j + 1] = a[j]; // 把前面数依次后移一位}a[j + 1] = temp; // 把数据插入}}}
算法分析:
直接插入排序算法的空间复杂度为O(1)。最好的情况,要比较的无序序列原本就是顺序有序的,那么要比较的次数是n-1,移动了0次,时间复杂度O(n)。最坏的情况,要比较的无序序列原本就是逆序有序的,那么要比较的次数是(n+2)(n-1)/2,移动的次数(n+4)(n-1)/2,时间复杂度O(n²)。直接插入排序的平均复杂度为O(n²)。
直接插入排序是稳定的。
2.希尔排序
适用情况:对于直接插入排序问题,数据量巨大时。
关于希尔排序,其实就可以理解为让直接插入排序最差的变得更加高效
希尔排序的思想就是一种类似的分治的思想,首先我们把一个序列分成多个模块,然后对每个模块中对应下标相同的元素进行排序,这样就可以达到最快速度的把大的放前面,小的放后面(如果是升序相反)。
所以希尔排序的实质是把序列变成接近有序的序列,然后进行一次直接插入排序。
代码实现:
public class ShellSort {public static void main(String[] args) {int a[] = { 6, 4, 8, 2, 3, 1 };new ShellSort().shellSort(a);System.out.println(Arrays.toString(a));}void shellSort(int a[]) {int gap = a.length;// 增量int j;while (gap > 1) {gap = gap / 3 + 1; // 以一定的增量进行跳跃式比较和交换for (int i = gap; i < a.length; i++) {int temp = a[i];for (j = i - gap; j >= 0 && temp < a[j]; j -= gap) {a[j + gap] = a[j];}a[j + gap] = temp;}}}}
- 算法分析
希尔排序的空间复杂度为O(1)。
希尔排序在最坏的情况下的运行时间是O(n²),平均时间复杂度为O(n^1.3)。希尔排序对于多达几千个数据项的,中等大小规模的数组排序表现良好。希尔排序不像快速排序和其它时间复杂度为O(nlog2n)的排序算法那么快,因此对非常大的文件排序,它不是最优选择。但是,希尔排序比选择排序和插入排序这种时间复杂度为O(n²)的排序算法还是要快得多,并且它非常容易实现。
- 当希尔排序的最好情况对于直接插入排序而言就是最差情况,希尔排序的最差情况对于直接插入排序而言就是最好情况。
- 此外希尔排序是不稳定的。
阅读全文
0 0
- 直接插入排序与希尔排序
- 数据结构-直接插入排序与希尔排序
- 直接插入排序与希尔排序
- 直接插入排序与希尔排序
- 直接插入排序与希尔排序
- 直接插入排序与希尔排序
- 插入排序(直接插入排序与希尔排序)
- 直接插入排序,希尔排序
- 直接插入排序、希尔排序
- 直接插入排序-->希尔排序
- 插入排序-直接插入排序 希尔排序
- 【排序算法】直接插入排序与希尔(Shell)排序
- 排序序列之直接插入排序与希尔排序
- 排序算法之直接插入排序与希尔排序
- 直接插入排序,希尔排序,快速排序
- 插入排序(直接插入+希尔排序)
- 直接插入排序、二分插入排序、希尔排序、冒泡排序与简单选择排序
- 插入排序(直接 和 希尔)
- 密码强度等级
- C++获取当前路径
- FTP连接格式
- php通过curl发送get和post请求
- 一些SVG向下兼容优雅降级技术
- 直接插入排序与希尔排序
- 最大流问题预流推进算法(最基本)
- linux知识捡捡看---查询端口和进程
- Java八大排序算法之"希尔排序(最小增量排序)"算法
- MySQL存储过程中的while循环
- SQL面试题
- AndroidStudio设置当前项目的代码管理工具
- python学习 思维导图
- 多路复用I/O Epoll的简单使用