希尔排序图解流程图

如题所述

第1个回答  2022-10-29
.example-btn{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.example-btn:hover{color:#fff;background-color:#47a447;border-color:#398439}.example-btn:active{background-image:none}div.example{width:98%;color:#000;background-color:#f6f4f0;background-color:#d0e69c;background-color:#dcecb5;background-color:#e5eecc;margin:0 0 5px 0;padding:5px;border:1px solid #d4d4d4;background-image:-webkit-linear-gradient(#fff,#e5eecc 100px);background-image:linear-gradient(#fff,#e5eecc 100px)}div.example_code{line-height:1.4em;width:98%;background-color:#fff;padding:5px;border:1px solid #d4d4d4;font-size:110%;font-family:Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;word-break:break-all;word-wrap:break-word}div.example_result{background-color:#fff;padding:4px;border:1px solid #d4d4d4;width:98%}div.code{width:98%;border:1px solid #d4d4d4;background-color:#f6f4f0;color:#444;padding:5px;margin:0}div.code div{font-size:110%}div.code div,div.code p,div.example_code p{font-family:"courier new"}pre{margin:15px auto;font:12px/20px Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;border:1px solid #ddd;border-left-width:4px;padding:10px 15px} 排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。以下是希尔排序算法:

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;
希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
1. 算法步骤
选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;

按增量序列个数 k,对序列进行 k 趟排序;

每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
2. 动图演示

代码实现 JavaScript 实例 function shellSort ( arr ) {
    var len = arr. length ,
        temp ,
        gap = 1 ;
    while ( gap 0 ; gap = Math . floor ( gap / 3 ) ) {
        for ( var i = gap ; i = 0 && arr [ j ] > temp ; j -= gap ) {
                arr [ j + gap ] = arr [ j ] ;
            }
            arr [ j + gap ] = temp ;
        }
    }
    return arr ;
}
Python 实例 def shellSort ( arr ) :
    import math
    gap = 1
    while ( gap 0 :
        for i in range ( gap , len ( arr ) ) :
            temp = arr [ i ]
            j = i-gap
            while j >= 0 and arr [ j ] > temp:
                arr [ j+gap ] = arr [ j ]
                j- = gap
            arr [ j+gap ] = temp
        gap = math . floor ( gap/ 3 )
    return arr
Go 实例 func shellSort ( arr [] int ) [] int {
        length := len ( arr )
        gap := 1
        for gap < length / 3 {
                gap = gap * 3 + 1
        }
        for gap > 0 {
                for i := gap ; i < length ; i ++ {
                        temp := arr [ i ]
                        j := i - gap
                        for j > = 0 && arr [ j ] > temp {
                                arr [ j + gap ] = arr [ j ]
                                j -= gap
                        }
                        arr [ j + gap ] = temp
                }
                gap = gap / 3
        }
        return arr
}
Java 实例 public static void shellSort ( int [ ] arr ) {
    int length = arr. length ;
    int temp ;
    for ( int step = length / 2 ; step >= 1 ; step /= 2 ) {
        for ( int i = step ; i = 0 && arr [ j ] > temp ) {
                arr [ j + step ] = arr [ j ] ;
                j -= step ;
            }
            arr [ j + step ] = temp ;
        }
    }
}
PHP 实例 function shellSort ( $arr )
{
    $len = count ( $arr ) ;
    $temp = 0 ;
    $gap = 1 ;
    while ( $gap 0 ; $gap = floor ( $gap / 3 ) ) {
        for ( $i = $gap ; $i = 0 && $arr [ $j ] > $temp ; $j -= $gap ) {
                $arr [ $j + $gap ] = $arr [ $j ] ;
            }
            $arr [ $j + $gap ] = $temp ;
        }
    }
    return $arr ;
}
C 实例 void shell_sort ( int arr [ ] , int len ) {
        int gap , i , j ;
        int temp ;
        for ( gap = len >> 1 ; gap > 0 ; gap >>= 1 )
                for ( i = gap ; i = 0 && arr [ j ] > temp ; j -= gap )
                                arr [ j + gap ] = arr [ j ] ;
                        arr [ j + gap ] = temp ;
                }
}
C++ 实例 template
void shell_sort ( T array [ ] , int length ) {
    int h = 1 ;
    while ( h = 1 ) {
        for ( int i = h ; i = h && array [ j ] 0) { for (int i = gap; i arr.Length; i++) { int tmp = arr[i]; int j = i - gap; while (j >= 0 && arr[j] > tmp) { arr[j + gap] = arr[j]; j -= gap; } arr[j + gap] = tmp; } gap /= 3; } } 以上为希尔排序算法详细介绍,插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等排序算法各有优缺点,用一张图概括:

关于时间复杂度

平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。

线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序;

O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序

线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。

关于稳定性

稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。

不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。

名词解释:

n:数据规模

k:"桶"的个数

In-place:占用常数内存,不占用额外内存

Out-place:占用额外内存

稳定性:排序后 2 个相等键值的顺序和排序之前它们的顺序相同
相似回答
大家正在搜