插入(希尔)排序时间、空间复杂度

编程入门 行业动态 更新时间:2024-10-10 00:22:24

插入(<a href=https://www.elefans.com/category/jswz/34/1769823.html style=希尔)排序时间、空间复杂度"/>

插入(希尔)排序时间、空间复杂度

时间avg时间min时间max空间avg稳定性

插入:O(n²)

希尔:O(n√n)(O(n^(1.3—2)))(与序列有关)

希尔:O(n^(1.3))

插入:o(n)序列已经是期望顺序了,在这种情况下,需要进行的比较操作需(n-1)次即可

希尔:O(n²)

插入:O(n²)序列是期望顺序的相反序列,那么此时需要进行的比较共有n(n-1)/2次

希尔、插入排序

使用的空间是O(1)

稳定性:

希尔:不稳定

插入:稳定

 

插入排序:

算法优点:稳定,快。
算法缺点:比较次数不一定,比较次数越多,插入点后的数据移动越多(特别是当数据总量庞大的时候)。但用链表可以解决这个问题

适用:当元素数量小分布有序要求稳定直接插入排序将大大减少比较次数和移动记录的次数

希尔排序

优缺:

 时间复杂度取决于所用序列:

不稳定;取决于增量序列选择的好坏

插入排序改进措施

  1. 优化为希尔排序:希尔排序法是对直接插入排序法的优化,通过设置一个增量,对原始序列进行分组,对每组用直接插入排序法排序再整合,再缩小增量,周而复始直至增量为1,完成排序,因此又叫“缩小增量排序法”。
            其实到希尔算法进行到最后,n的值变为1(即增量或者称跳跃数变为1)的时候,它就是直接插入排序,只不过这时候,整个序列基本上是有序的,需要交换的数据已经非常少了,提高效率。
package main.Test;import java.util.Arrays;public class XiErSort {//    非递归private static void sort(int arr[]) {for(int d = arr.length/2; d >= 1; d/=2) {for(int i = d; i < arr.length; i++) {int j = i;while (j - d >= 0 && arr[j - d] > arr[j]) {swap(arr, j, j - d);j -= d;}}}}//    递归private static void sort(int arr[], int d) {for(int i = d; i < arr.length; i++) {int j = i;while (j - d >= 0 && arr[j - d] > arr[j]) {swap(arr, j, j - d);j -= d;}}if (d/2 >= 1)sort(arr, d/2);}private static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}public static void main(String[] args) {int[] a = new int[]{1, 2, 4, 5, 3, 1, 2, 3};sort(a, a.length);System.out.println(Arrays.toString(a));}
}

 

 

 

更多推荐

插入(希尔)排序时间、空间复杂度

本文发布于:2023-06-28 07:05:38,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/923579.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:希尔   复杂度   时间   空间

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!