希尔排序的正确性 (Correctness of ShellSort)
学希尔排序的时候,觉得有序性保持的性质十分神奇,但哪里都找不到数学证明。最后在Donald E. Knuth的The Art of Computer Programming中找到了(显然我没有读过这套书),现摘录并整理之。
Theorem K. If a k-ordered file is h-sorted, it remains k-ordered.
Thus a file that is first 7-sorted, then 5-sorted, becomes both 7-ordered and 5-ordered. And if we 3-sort it, the result is ordered by 7s, 5s, and 3s. Examples of this remarkable property can be seen in Table 4 on page 85.
Proof. Exercise 20 shows that Theorem K is a consequence of the following fact:
Lemma L. Let m, n, r be nonnegative integers, and let (x1 , ... , xm+r) and (y1 , ... , yn+r) be any sequences of numbers such that
y1 ≤ xm+1 , y2 ≤ xm+2 , ... , yr ≤ xm+r (7)
If the x's and y's are sorted independently, so that x1 ≤ ... ≤ xm+r and y1 ≤ ... ≤ yn+r , the relations (7) will still be valid.
Proof. All but m of the x’s are known to be dominate (that is, to be greater than or equal to) some y, where distinct x’s dominate distinct y’s. Let 1 ≤ j ≤ r. Since xm+j after sorting dominates m + j of the x’s, it dominates at least j of the y’s; therefore it dominates the smallest j of the y’s; hence xm+j ≥ yj after sorting.
Exercise 20. Show that Theorem K follows from Lemma L.
Solution. (This is much harder to write down than to understand.) Assume that a k-ordered file R1 , ... , RN has been h-sorted, and let 1 ≤ i ≤ N - k; we want to show that Ki ≤ Ki+k . Find u, v such that i ≡ u and i + k ≡ v (modulo h), 1 ≤ u, v ≤ h; and apply Lemma L with xj = Kv+(j-1)h , yj = Ku+(j-1)h . Then the first r elements Ku , Ku+h , ... , Ku+(r-1)h of the y’s are respectively ≤ the last r elememts Ku+k , Ku+k+h , ... , Ku+k+(r-1)h of the x’s, where r is the greatest integer such that u + k + (r - 1)h ≤ N.

定理 如果一个序列是k有序的,在h排序后它保持k有序。
证明 引理:设m, n, r为非负整数,(x1 , ... , xm+r)与(y1 , ... , yn+r)为满足以下性质的序列:
y1 ≤ xm+1 , y2 ≤ xm+2 , ... , yr ≤ xm+r
那么如果x和y被分别排序,使x1 ≤ ... ≤ xm+r且y1 ≤ ... ≤ yn+r ,则以上关系仍成立。
除m个以外所有x都大于等于某个y,其中不同的x大于等于不同的y。设1 ≤ j ≤ r。由于排序后xm+j大于等于x中的m + j个,它至少大于y中的j个。因此它大于等于y中最小的j个,故排序后xm+j ≥ yj,引理得证。
假设k有序的序列R1 , ... , RN被h排序,设1 ≤ i ≤ N - k,即证Ki ≤ Ki+k。存在u、v使i ≡ u,i + k ≡ v (mod h),其中1 ≤ u,v ≤ h。将xj = Kv+(j-1)h ,yj = Ku+(j-1)h代入引理。则y中的前r个元素Ku , Ku+h , ... , Ku+(r-1)h分别小于等于x中的后r个元素Ku+k , Ku+k+h , ... , Ku+k+(r-1)h ,其中r是满足u + k + (r - 1)h ≤ N的最大整数。证毕。
因此一开始7有序的序列在5排序后同时成为7有序与5有序的。如果再3排序,结果是7、5与3有序的。
希尔排序的正确性 (Correctness of ShellSort)的更多相关文章
- Java基础知识强化57:经典排序之希尔排序(ShellSort)
1. 希尔排序的原理: 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出 ...
- C#算法基础之希尔排序
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 希尔排序(shell‘ sort)
希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序 基本思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录 ...
- java排序算法之希尔排序
希尔排序是冲破二次时间屏障的第一批算法之一. 它是通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到最后一趟(比较相邻元素)为止.因此希尔排序也叫缩减增量排序. 希尔排序使 ...
- C数据结构排序算法——希尔排序法用法总结(转http://www.cnblogs.com/skywang12345/p/3597597.html)
希尔排序介绍 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它 ...
- 希尔排序(Shellsort)
首先,Shell是发明这个算法的人名,不是这个算法的思想或者特点. 希尔排序,也称为增量递减排序.基本思路,是把原来的序列,等效视为一个矩阵的形式.矩阵的列数,也称为宽度或者增量,记为w. 假设数组A ...
- C#数据结构与算法系列(二十一):希尔排序算法(ShellSort)
1.介绍 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 2.基本思想 希尔排 ...
- 排序--ShellSort 希尔排序
希尔排序 no 实现 希尔排序其实就是插入排序.只不过希尔排序在比较的元素的间隔不是1. 我们知道插入排序 都是 一个一个和之前的元素比较.发现比之前元素小就交换位置.但是希尔排序可能是和前第n个元素 ...
- uva 10152 ShellSort 龟壳排序(希尔排序?)
今天状态总是很糟,这种题目卡了一天... 是不是休息时间太少了,头脑迟钝了... 名字叫希尔排序,我还以为跟它有关,还搜索了下资料. 只要找到trick就会发现是很水的题目.只要对比下就能找到哪些是移 ...
随机推荐
- 一文了解:Redis的RDB持久化
一文了解:Redis的RDB持久化 Redis是内存数据库,为了保证数据不在故障后丢失,Redis需要将数据持久化到硬盘上. Redis持久化有两种方式:一种是快照,全量备份.一种是AOF方式,连续增 ...
- bat 搜索进程名并kill
@echo off set/p "target=进程名(默认nginx): "if not defined target (set "target=nginx" ...
- Linux 根分区扩容
扩容分区之前,首先要保证当前有闲置空间 1. 查看当前现有分区情况 df -lah 可以看出当前根分区只剩 6.4 G 可用 2. 查看当前磁盘情况 fdisk -l 可以看出有 30G的未分配空间 ...
- iview中page组件的跳转功能BUG解决方案
xl_echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! 在 ...
- Mac 查找粘贴板记录
0x00 大落 一件蛮坑爹的事情,复制了找了好久的内容合集,在回别人的信息的时候又进行了复制其他内容的操作,结果吾覆盖了的上一次复制的内容-- 于是开始找找 macOS 有没有粘贴板记录的东西,然后在 ...
- keras 学习笔记:从头开始构建网络处理 mnist
全文参考 < 基于 python 的深度学习实战> import numpy as np from keras.datasets import mnist from keras.model ...
- HelloDjango 第 09 篇:让博客支持 Markdown 语法和代码高亮
作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 为了让博客文章具有良好的排版,显示更加丰富的格式,我们使用 Markdown 语法来书 ...
- 小白学Python(3)——输入和输出,显示你的名字
任何计算机程序都是为了执行一个特定的任务,有了输入,用户才能告诉计算机程序所需的信息,有了输出,程序运行后才能告诉用户任务的结果. 输入是Input,输出是Output,因此,我们把输入输出统称为In ...
- Python 数据科学-Numpy
NumPy Numpy :提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于多维数组(矩阵)处理的库.用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多.本身是由C语 ...
- Linux--shell数组和字符串--09
一.数组 数组就是一段连续的变量,一段连续的内存存储空间,为了解决变量过多的问题,在同一类变量中,我们不需要去定义多个名字,而是以数组的方式来定义 1.定义数组 declare -a 定义数组 dec ...