夯实基础——希尔排序

物理结构:数组

希尔排序分析:

最优时间复杂度:O(n) 顺序的情况下

最坏时间复杂度:O(nlog^2n)

平均时间复杂度:根据增量不同而不同

最坏空间复杂度:O(n)

稳定性:不稳定

希尔排序函数:

int ShellSort(int a[],int length);

//希尔排序,缩小增量的插入排序
int ShellSort(int a[],int length)
{
    int incre=0,i,j,tmp;
    while(incre<length)//构造增量规则
    {
        incre=incre*2+1;
    }
    //插入排序
    while(incre>0)
    {
        for(i=incre;i<length;i++)
        {
            j=i-incre;
            tmp=a[i];
            while(j>=0&&a[j]>tmp)
            {
                a[j+incre]=a[j];
                j=j-incre;
            }
            a[j+incre]=tmp;
        }
        incre=(incre-1)/2;
    }
}
时间: 2024-10-29 19:07:11

夯实基础——希尔排序的相关文章

夯实基础——选择排序

物理结构:数组 选择排序分析: 最优时间复杂度:O(n^2) 最坏时间复杂度:O(n^2) 平均时间复杂度:O(n^2) 最差空间复杂度:O(n) 稳定性:不稳定 选择排序函数: int SelectSort(int a[],int length); //选择排序 //每次选最小值放在最前面 int SelectSort(int a[],int length) { int i,j,min; for(i=0;i<length;i++) { min=i; for(j=i;j<length;j++)

算法基础之希尔排序

希尔排序的实质就是分组插入排序, 是对直接插入排序的改进. 时间复杂度为O(nlongn), 跟快速排序, 堆排序的时间复杂度相同, 是一种较为快速的排序方式. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的 元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为 直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提

数据结构和算法基础之希尔排序

/// <summary> /// 希尔排序 /// 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序 /// 排序过程:先取一个正整数d1<n, /// 把所有序号相隔d1的数组元素放一组,组内进行直接插入排序: /// 然后取d2<d1, /// 重复上述分组和排序操作:直至di=1,即所有记录放进一个组中排序为止 /// </summary> /// <param name="arry"></param>

希尔排序总结

数据结构之排序算法——希尔排序 代码很多地方借鉴了  http://my.csdn.net/MoreWindows 他的思想, 本人认为该作者已经写的很好了,只是在他的基础上加入了一些自己的理解和说明 如果涉及到版权的问题,请联系我的邮箱,我会尽快删除 希尔排序想关链接: 维基百科:https://zh.wikipedia.org/wiki/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F#C.E8.AA.9E.E8.A8.80 百度百科:http://baike.bai

排序算法入门之希尔排序(java实现)

希尔排序是对插入排序的改进.插入排序是前面元素已经有序了,移动元素是一个一个一次往后移动,当插入的元素比前面排好序的所有元素都小时,则需要将前面所有元素都往后移动.希尔排序有了自己的增量,可以理解为插入排序的增量为1,希尔排序增量是gap.代码就是在插入排序代码的基础上多了一层增量变化的循环.可以参考http://www.cnblogs.com/chengxiao/p/6104371.html,博主作了详尽介绍. public static void shellSort(int[] a){ in

数据结构例程——插入排序之希尔排序

本文是[数据结构基础系列(9):排序]中第3课时[插入排序之希尔排序]的例程. 1.希尔排序 #include <stdio.h> #define MaxSize 20 typedef int KeyType; //定义关键字类型 typedef char InfoType[10]; typedef struct //记录类型 { KeyType key; //关键字项 InfoType data; //其他数据项,类型为InfoType } RecType; //排序的记录类型定义 void

java希尔排序算法

原文:java希尔排序算法 代码下载地址:http://www.zuidaima.com/share/1550463279090688.htm 希尔排序算法的基本思想是:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组内进行直接插人排序:然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<-<d2<d1),即所有记录放在同一组中进行直接插入排序为止.该方法实质上是一种

java基础算法--排序大全

1 package sorting; 2 3 import java.util.*; 4 //import java.util.Comparator; 5 //import java.util.PriorityQueue; 6 //import java.util.Queue; 7 8 public class Sorting { 9 /************************************序言******************************************

数据结构之插入排序与希尔排序

1.直接插入排序 直接插入排序是一种最简单的排序算法,它的基本操作是将一个记录插入到已经排序好的序列中,从而得到一个新的有序表.直接插入排序算法原理如下图所示: 直接插入排序算法如下: void InsertSort(int arr[],int length) { int key,j; for(int i=1;i<length;++i) { key=arr[i]; //记录标志; j=i-1; //循环比较并且交换相邻的两个数; while (j>=0&&arr[j]>k