Algs4-2.1.12令希尔排序打印出递增序列的每个元素所带来的比较次数和数组大小的比值

2.1.12令希尔排序打印出递增序列的每个元素所带来的比较次数和数组大小的比值。编写一个测试用例对随机Double数组进行希尔排序,验证该值是一个小常数,数组大小按照10的冪次递增,不小于100。

public class E2d1d12
{
    public static int compareTimes=0;
    public static int maxRate=0;
    public static void sort(Comparable[] a)
    {
        int N=a.length;
        int h=1;
        while (h<N/3) h=3*h+1;
        while (h>=1)
        {
            compareTimes=0;
            for (int i=h;i<N;i++)
            {
                for (int j=i;j>=h && less(a[j],a[j-h]);j-=h)
                    exch(a,j,j-h);
              
            }
             if(compareTimes/N>maxRate) maxRate= compareTimes/N;
            StdOut.printf("N=%d,h=%d,compareTimes=%d,rate=%d\n",N,h,compareTimes,compareTimes/N);
            h=h/3;
        }
    }
   
    private static boolean less(Comparable v,Comparable w)
    {
        compareTimes++;
        return v.compareTo(w)<0;
    }
   
    private static void exch(Comparable[] a,int i,int j)
    {
        Comparable t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
   
    private static void show(Comparable[] a)
    {
        for (int i=0;i<a.length;i++)
            StdOut.print(a[i]+" ");
        StdOut.println();
    }
   
    public static boolean isSorted(Comparable[] a)
    {
        for (int i=0;i<a.length;i++)
            if(less(a[i],a[i-1])) return false;
        return true;
    }
   
    public static void main(String[] args)
    {
       
        for ( int N=100;N<=10000000;N=N*10)
        {
           Double[] a=new Double[N];
           for (int i=0;i<N;i++)
               a[i]=StdRandom.uniform(100.0,100000000.0);
        sort(a);
        }
        StdOut.println("maxRate=" + maxRate);
    }
  
}

原文地址:https://www.cnblogs.com/longjin2018/p/9860019.html

时间: 2024-10-30 02:10:08

Algs4-2.1.12令希尔排序打印出递增序列的每个元素所带来的比较次数和数组大小的比值的相关文章

编写函数,接受一个string,返回一个bool值,指出string是否有5个或者更多字符,使用此函数打印出长度大于等于5的元素

#include <algorithm> using namespace std; bool isFive(const string& s1) { return s1.size() >=5; } void shortFive(vector<string>& words, vector<string>::size_type sz) { auto end_five= partition(words.begin(), words.end(), isFiv

希尔排序-C实现

希尔排序算法 //排成递增序列 void shell_sort(int *a, int n){ int gap = n/2; //每一波gap缩一半 for(;gap>0; gap/=2){ //按gap的间隔,一直往后移动 for(int i = 0; i < n-gap; i++){ int tmp = i; //发现前面节点大于后面节点,则互换 //往左换的那个值要不停地以gap互换,直到[0-i]的.间距为gap的子串为递增序列 while(tmp>=0 && a

排序四 希尔排序

要点 希尔(Shell)排序又称为缩小增量排序,它是一种插入排序.它是直接插入排序算法的一种威力加强版. 该方法因DL.Shell于1959年提出而得名. 希尔排序的基本思想是:把记录按下标的一定增量 gap 分组,对每组记录采用直接插入排序方法进行排序.随着增量逐渐减小,所分成的组包含的记录越来越多,到增量的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序. 我们来通过演示图,更深入的理解一下这个过程. 在上面这幅图中: 初始时,有一个大小为 10 的无序序列. 在第一趟排序

排序算法之希尔排序

文章转载自http://www.cnblogs.com/chengxiao/ 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组

算法基础之希尔排序

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

希尔排序算法

/* Date:2014.12.14 希尔排序思路:基于插入排序的思想. 流程:1).将有 n 个元素的数组分成 n/2 对,第1个数据和第(n/2 + 1)个数据为一对,依次配对: 2).一次循环使每一个序列对排好顺序: 3).再分为 n/4 对进行排序: 4).重复操作,随序列对数的减少最后变为1个,就完成了整个序列的排序. 时间复杂度:最差(O(ns) 1<s<2),平均O(nlogn). 空间复杂度:O(1). 是一种  不稳定  的排序算法. */ void ShellSort(in

排序算法(二)之希尔排序

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现. 基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. 简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然

希尔排序(插入排序)-八大排序三大查找汇总(5)

基本思想 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序. 稳定性 由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的. 时间复杂度 希尔排序的时间复杂度取决于步长的选择. 平均情况下,

排序算法:希尔排序

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高. 以n=10的一个数组49, 38, 65, 97, 26,