内排序之希尔排序

body { background-color: white }
.markdown-body { min-width: 200px; max-width: 760px; margin: 0 auto; padding: 20px; color: #333; overflow: hidden; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif; font-size: 16px; line-height: 1.6 }
.markdown-body a { background: transparent }
.markdown-body a:active,.markdown-body a:hover { outline: 0 }
.markdown-body strong { font-weight: bold }
.markdown-body h1 { font-size: 2em; margin: 0.67em 0 }
.markdown-body img { border: 0 }
.markdown-body hr { height: 0 }
.markdown-body pre { overflow: auto }
.markdown-body code,.markdown-body kbd,.markdown-body pre { font-family: monospace, monospace; font-size: 1em }
.markdown-body input { color: inherit; font: inherit; margin: 0 }
.markdown-body html input[disabled] { cursor: default }
.markdown-body input { line-height: normal }
.markdown-body input[type="checkbox"] { padding: 0 }
.markdown-body table { border-collapse: collapse; border-spacing: 0 }
.markdown-body td,.markdown-body th { padding: 0 }
.markdown-body * { }
.markdown-body input { font: 13px/1.4 Helvetica, arial, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol" }
.markdown-body a { color: #4183c4; text-decoration: none }
.markdown-body a:hover,.markdown-body a:focus,.markdown-body a:active { text-decoration: underline }
.markdown-body hr { height: 0; margin: 15px 0; overflow: hidden; background: transparent; border: 0; border-bottom: 1px solid #ddd }
.markdown-body hr::before { display: table; content: "" }
.markdown-body hr::after { display: table; clear: both; content: "" }
.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6 { margin-top: 15px; margin-bottom: 15px; line-height: 1.1 }
.markdown-body h1 { font-size: 30px }
.markdown-body h2 { font-size: 21px }
.markdown-body h3 { font-size: 16px }
.markdown-body h4 { font-size: 14px }
.markdown-body h5 { font-size: 12px }
.markdown-body h6 { font-size: 11px }
.markdown-body blockquote { margin: 0 }
.markdown-body ul,.markdown-body ol { padding: 0; margin-top: 0; margin-bottom: 0 }
.markdown-body ol ol,.markdown-body ul ol { list-style-type: lower-roman }
.markdown-body ul ul ol,.markdown-body ul ol ol,.markdown-body ol ul ol,.markdown-body ol ol ol { list-style-type: lower-alpha }
.markdown-body dd { margin-left: 0 }
.markdown-body code { font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace }
.markdown-body pre { margin-top: 0; margin-bottom: 0; font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace }
.markdown-body kbd { background-color: #e7e7e7; background-image: linear-gradient(#fefefe, #e7e7e7); background-repeat: repeat-x; border: 1px solid #cfcfcf; color: #000; padding: 3px 5px; line-height: 10px; font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace; display: inline-block }
.markdown-body>*:first-child { margin-top: 0 !important }
.markdown-body>*:last-child { margin-bottom: 0 !important }
.markdown-body .anchor { position: absolute; top: 0; bottom: 0; left: 0; display: block; padding-right: 6px; padding-left: 30px; margin-left: -30px }
.markdown-body .anchor:focus { outline: none }
.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6 { position: relative; margin-top: 1em; margin-bottom: 16px; font-weight: bold; line-height: 1.4 }
.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link { display: none; color: #000; vertical-align: middle }
.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor { height: 1em; padding-left: 8px; margin-left: -30px; line-height: 1; text-decoration: none }
.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link { display: inline-block }
.markdown-body h1 { padding-bottom: 0.3em; font-size: 2.25em; line-height: 1.2; border-bottom: 1px solid #eee }
.markdown-body h2 { padding-bottom: 0.3em; font-size: 1.75em; line-height: 1.225; border-bottom: 1px solid #eee }
.markdown-body h3 { font-size: 1.5em; line-height: 1.43 }
.markdown-body h4 { font-size: 1.25em }
.markdown-body h5 { font-size: 1em }
.markdown-body h6 { font-size: 1em; color: #777 }
.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre { margin-top: 0; margin-bottom: 16px }
.markdown-body hr { height: 4px; padding: 0; margin: 16px 0; background-color: #e7e7e7; border: 0 none }
.markdown-body ul,.markdown-body ol { padding-left: 2em }
.markdown-body ul ul,.markdown-body ul ol,.markdown-body ol ol,.markdown-body ol ul { margin-top: 0; margin-bottom: 0 }
.markdown-body li>p { margin-top: 16px }
.markdown-body dl { padding: 0 }
.markdown-body dl dt { padding: 0; margin-top: 16px; font-size: 1em; font-style: italic; font-weight: bold }
.markdown-body dl dd { padding: 0 16px; margin-bottom: 16px }
.markdown-body blockquote { padding: 0 15px; color: #777; border-left: 4px solid #ddd }
.markdown-body blockquote>:first-child { margin-top: 0 }
.markdown-body blockquote>:last-child { margin-bottom: 0 }
.markdown-body table { display: block; width: 100%; overflow: auto }
.markdown-body table th { font-weight: bold }
.markdown-body table th,.markdown-body table td { padding: 6px 13px; border: 1px solid #ddd }
.markdown-body table tr { background-color: #fff; border-top: 1px solid #ccc }
.markdown-body table tr:nth-child(2n) { background-color: #f8f8f8 }
.markdown-body img { max-width: 100% }
.markdown-body code { padding: 0; padding-top: 0.2em; padding-bottom: 0.2em; margin: 0; font-size: 85%; background-color: rgba(0,0,0,0.04) }
.markdown-body code::before,.markdown-body code::after { letter-spacing: -0.2em; content: "?" }
.markdown-body pre>code { padding: 0; margin: 0; font-size: 100%; white-space: pre; background: transparent; border: 0 }
.markdown-body .highlight { margin-bottom: 16px }
.markdown-body .highlight pre,.markdown-body pre { padding: 16px; overflow: auto; font-size: 85%; line-height: 1.45; background-color: #f7f7f7 }
.markdown-body .highlight pre { margin-bottom: 0 }
.markdown-body pre { }
.markdown-body pre code { display: inline; max-width: initial; padding: 0; margin: 0; overflow: initial; line-height: inherit; background-color: transparent; border: 0 }
.markdown-body pre code::before,.markdown-body pre code::after { content: normal }
.markdown-body .highlight { background: #fff }
.markdown-body .highlight .mf,.markdown-body .highlight .mh,.markdown-body .highlight .mi,.markdown-body .highlight .mo,.markdown-body .highlight .il,.markdown-body .highlight .m { color: #945277 }
.markdown-body .highlight .s,.markdown-body .highlight .sb,.markdown-body .highlight .sc,.markdown-body .highlight .sd,.markdown-body .highlight .s2,.markdown-body .highlight .se,.markdown-body .highlight .sh,.markdown-body .highlight .si,.markdown-body .highlight .sx,.markdown-body .highlight .s1 { color: #df5000 }
.markdown-body .highlight .kc,.markdown-body .highlight .kd,.markdown-body .highlight .kn,.markdown-body .highlight .kp,.markdown-body .highlight .kr,.markdown-body .highlight .kt,.markdown-body .highlight .k,.markdown-body .highlight .o { font-weight: bold }
.markdown-body .highlight .kt { color: #458 }
.markdown-body .highlight .c,.markdown-body .highlight .cm,.markdown-body .highlight .c1 { color: #998; font-style: italic }
.markdown-body .highlight .cp,.markdown-body .highlight .cs { color: #999; font-weight: bold }
.markdown-body .highlight .cs { font-style: italic }
.markdown-body .highlight .n { color: #333 }
.markdown-body .highlight .na,.markdown-body .highlight .nv,.markdown-body .highlight .vc,.markdown-body .highlight .vg,.markdown-body .highlight .vi { color: #008080 }
.markdown-body .highlight .nb { color: #0086B3 }
.markdown-body .highlight .nc { color: #458; font-weight: bold }
.markdown-body .highlight .no { color: #094e99 }
.markdown-body .highlight .ni { color: #800080 }
.markdown-body .highlight .ne { color: #990000; font-weight: bold }
.markdown-body .highlight .nf { color: #945277; font-weight: bold }
.markdown-body .highlight .nn { color: #555 }
.markdown-body .highlight .nt { color: #000080 }
.markdown-body .highlight .err { color: #a61717; background-color: #e3d2d2 }
.markdown-body .highlight .gd { color: #000; background-color: #fdd }
.markdown-body .highlight .gd .x { color: #000; background-color: #faa }
.markdown-body .highlight .ge { font-style: italic }
.markdown-body .highlight .gr { color: #aa0000 }
.markdown-body .highlight .gh { color: #999 }
.markdown-body .highlight .gi { color: #000; background-color: #dfd }
.markdown-body .highlight .gi .x { color: #000; background-color: #afa }
.markdown-body .highlight .go { color: #888 }
.markdown-body .highlight .gp { color: #555 }
.markdown-body .highlight .gs { font-weight: bold }
.markdown-body .highlight .gu { color: #800080; font-weight: bold }
.markdown-body .highlight .gt { color: #aa0000 }
.markdown-body .highlight .ow { font-weight: bold }
.markdown-body .highlight .w { color: #bbb }
.markdown-body .highlight .sr { color: #017936 }
.markdown-body .highlight .ss { color: #8b467f }
.markdown-body .highlight .bp { color: #999 }
.markdown-body .highlight .gc { color: #999; background-color: #EAF2F5 }
.markdown-body .octicon { font: normal normal 16px octicons-anchor; line-height: 1; display: inline-block; text-decoration: none }
.markdown-body .octicon-link::before { content: "?" }
.markdown-body .task-list-item { list-style-type: none }
.markdown-body .task-list-item+.task-list-item { margin-top: 3px }
.markdown-body .task-list-item input { float: left; margin: 0.3em 0 0.25em -1.6em; vertical-align: middle }
table td { }
.hljs { display: block; padding: 0.5em; color: #333; background: #f8f8f8 }
.hljs-comment,.diff .hljs-header { color: #998; font-style: italic }
.hljs-keyword,.css .rule .hljs-keyword,.hljs-winutils,.nginx .hljs-title,.hljs-subst,.hljs-request,.hljs-status { color: #333; font-weight: bold }
.hljs-number,.hljs-hexcolor,.ruby .hljs-constant { color: #008080 }
.hljs-string,.hljs-tag .hljs-value,.hljs-doctag,.tex .hljs-formula { color: #d14 }
.hljs-title,.hljs-id,.scss .hljs-preprocessor { color: #900; font-weight: bold }
.hljs-list .hljs-keyword,.hljs-subst { font-weight: normal }
.hljs-class .hljs-title,.hljs-type,.vhdl .hljs-literal,.tex .hljs-command { color: #458; font-weight: bold }
.hljs-tag,.hljs-tag .hljs-title,.hljs-rule .hljs-property,.django .hljs-tag .hljs-keyword { color: #000080; font-weight: normal }
.hljs-attribute,.hljs-variable,.lisp .hljs-body,.hljs-name { color: #008080 }
.hljs-regexp { color: #009926 }
.hljs-symbol,.ruby .hljs-symbol .hljs-string,.lisp .hljs-keyword,.clojure .hljs-keyword,.scheme .hljs-keyword,.tex .hljs-special,.hljs-prompt { color: #990073 }
.hljs-built_in { color: #0086b3 }
.hljs-preprocessor,.hljs-pragma,.hljs-pi,.hljs-doctype,.hljs-shebang,.hljs-cdata { color: #999; font-weight: bold }
.hljs-deletion { background: #fdd }
.hljs-addition { background: #dfd }
.diff .hljs-change { background: #0086b3 }
.hljs-chunk { color: #aaa }

内排序之希尔排序

希尔排序是直接插入排序的优化算法,维基百科上的一段话:

假设有一个很小的数据在一个已按升序排好序的数组的末端, 如果用复杂度为O(n2)的排序(冒泡排序或插入排序), 可能会进行n次的比较和交换才能将该数据移至正确位置。而希尔排序会用较大的步长移动数据,所以小数据只需进行少数比较和交换即可到正确位置.

生命一个长度为16的数组: [13, 14, 94, 33, 82, 25, 59, 94, 65, 23, 45, 27, 73, 25, 39, 10], 以步长为5分组,借用维基百科上的图片如下:

依次按列进行插入排序,例如: 对13, 25, 45, 10进行插入排序,对14, 59, 27进行插入排序...

道理是这么个道理,编码的时候,我们的递归顺序跟不是像上面说的,而是(13, 25), (14, 59)...(82, 23) 这样一排一排 横着走的,不是真的按列进行编码。

python实现的代码如下:

# coding: utf-8

def shell_sort(list):
    # 挖坑法
    n = len(list)
    # 初始步长
    gap = n // 2
    while gap > 0:
        for i in range(gap, n):
            # 每个步长进行插入排序
            temp = list[i]
            j = i
            # 插入排序
            while j >= gap and list[j - gap] > temp:
                list[j] = list[j - gap]
                j -= gap
            list[j] = temp
        # 得到新的步长
        gap = gap // 2
    return list

def shell_sort_1(list):
    # 交换法
    n = len(list)
    # 初始步长
    gap = n // 2
    while gap > 0:
        for i in range(gap, n):
            # 每个步长进行插入排序
            temp = list[i]
            # 插入排序
            j = i - gap
            while j >= 0 and temp < list[j]:
                list[j], list[j + gap] = list[j + gap], list[j]
                j -= gap
        # 得到新的步长
        gap = gap // 2
    return list

if __name__ == "__main__":
    a = [3, 1, 9, 2, 3, 11, 8, 2, 0]
    print(a)
    shell_sort_1(a)
    # shell_sort(a)
    print(a)

原文地址:https://www.cnblogs.com/becker/p/9156902.html

时间: 2024-10-26 02:51:25

内排序之希尔排序的相关文章

内排序-希尔排序

算法思想:希尔排序可以看作是插入排序的一种变种,唯一不同的事选择一个间隔(大于1的值),先对按照间隔选择的序列进行插入排序,最后蜕减到间隔数为1 也即普通插入排序,则完成排序 package Sort; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ShellSort { public static void main(String []args) { // Lis

算法 希尔排序

希尔排序 Shell Sort 介绍: 希尔排序(Shell Sort)也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高. 执行流程: 首先

数据结构精要------直接插入排序和希尔排序算法

上篇总结中主要实践了算法的内排序的选择排序,那么接下来我们继续实践插入排序排序的两种:直接插入排序和希尔排序算法. -----直接插入排序 package com.sort; /** * 直接插入排序 * * @author weixing-yang * * 算法思路: * 每步将一个待排序的元素,插入到前面已排序好的一组元素中的适当位置, * 直到所有元素全部出入完成为止. */ public class InsertionSort { public void insertionSort(in

常见排序集合(冒泡排序,选择排序,直接插入排序,二分插入排序,快速排序,希尔排序,归并排序)

一下是一些常见的排序算法: 交换元素(后面算法都有用到): // 交换元素 private static void swap(int[] a, int i, int j) { int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } 冒泡排序(有优化): // 冒泡排序(优化①,②,③,④) private static void bubbleSort(int[] a) { boolean flag = false;// ①表示整个序列是无序的 for

快排,冒泡排,选择排序,希尔排序

package cn.hncu.dataStruct; public class SortMethods { /* 算法好坏的评价指标(一般只在n值非常大的时候才会考虑,如n取10万): * 1.时间复杂度: 通俗点,就是指程序运行的快慢(时间)---通常用计算机的运算(算术,赋值)次数来代替 * 2.空间复杂度: 占用内存空间的大小---通常用程序中使用了多少变量(栈内存.堆内存),这些变量总共占了多少内存 */ public static void main(String[] args) {

排序 之 冒泡排序 简单选择排序 直接插入排序 希尔排序

排序的基本概念 假设含有n个记录的序列为{r1,r2,--,rn},其相应的关键字分别为{k1,k2,--,kn},需确定1,2,--,n的一种排序p1,p2,--,pn,使其相应的关键字满足kp1≤kp2≤--≤kpn非递减(或非递增)关系,即使得序列称为一个按关键字有序的序列{rp1,rp2,--,rpn},这样的操作就称为排序. 排序的稳定性 假设ki=kj(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中ri领先于rj(即i<j).如果排序后ri仍领先于rj,则称所用的排序方法是稳定

插入排序 —— 希尔排序

 希尔排序  希尔排序也是插入排序的一种.又名缩小增量排序.它是对直接插入排序的一种改进. 直接插入排序是每次都和前面一个元素进行比较.其步长为 1. 希尔排序则不然,它得步长是动态变化的,或者说是由大到小变化的.希尔排序根据步长将整个序列分成n组.然后在各个子组内部分别进行元素的排序.接着缩小步长,相应的序列被分成的子组也就会减少,每个分组内部的元素个数也就相应的增加.接着对子组内部的元素进行排序.再次缩小步长,再次排序....直到步长为 1,即整个序列只有一个子组,也就是序列本身.这个时候再

希尔排序模板

希尔排序又称缩小增量排序 1.先取定一个小于n的整数gap1作为第一个增量,把整个序列分成gap1组.所有距离为gap1的倍数的元素放在同一组中,在各组内分别进行排序(分组内采用直接插入排序或其它基本方式的排序).(一般gap1为n/2,一次往后类推:gap2=gap/2,若为奇数,则gap2=(gap1+1)/2  gap1=(n+1)/2) 2.然后取第二个增量gap2<gap1,重复上述的分组和排序. 3.依此类推,直至增量gap=1,即所有元素放在同一组中进行排序为止. public c

野生前端的数据结构练习(10)希尔排序,归并排序,快速排序

一.希尔排序 shell sort也称缩小增量排序,是对插入排序算法的改进,其工作原理是定义一个间隔序列来表示排序过程中进行比较的元素之间有多远的间隔,每次将具有相同间隔的数分为一组,进行插入排序,大部分场景中,间隔是可以提前定义好的,也可以动态生成.在较大的数据集上,希尔排序对于插排的优化效果是非常明显的. ./** * 希尔排序示例代码 */ function shellSort(gaps, arr) { for(let g = 0; g < gaps.length; g++){ let h