`
异步获取爱
  • 浏览: 77673 次
  • 性别: Icon_minigender_1
  • 来自: 大男子主义世界
社区版块
存档分类
最新评论

Shell 排序法 - 改良的插入排序

阅读更多
Shell排序法最初是D.L Shell於1959所提出,假設要排序的元素有n個,則每次進行插入排序時並不是所有的元素同時進行時,而是取一段間隔。

Shell首先將間隔設定為n/2,然後跳躍進行插入排序,再來將間隔n/4,跳躍進行排序動作,再來間隔設定為n/8、n/16,直到間隔為1之後的最後一次排序終止,由於上一次的排序動作都會將固定間隔內的元素排序好,所以當間隔越來越小時,某些元素位於正確位置的機率越高,因此最後幾次的排序動作將可以大幅減低。

舉個例子來說,假設有一未排序的數字如右:89 12 65 97 61 81 27 2 61 98

數字的總數共有10個,所以第一次我們將間隔設定為10 / 2 = 5,此時我們對間隔為5的數字進行排序,如下所示:
      
Shell 排序
畫線連結的部份表示 要一起進行排序的部份,再來將間隔設定為5 / 2的商,也就是2,則第二次的插入排序對象如下所示:
      


再來間隔設定為2 / 2 = 1,此時就是單純的插入排序了,由於大部份的元素都已大致排序過了,所以最後一次的插入排序幾乎沒作什麼排序動作了:
      


將間隔設定為n / 2是D.L Shell最初所提出,在教科書中使用這個間隔比較好說明,然而Shell排序法的關鍵在於間隔的選定,例如Sedgewick證明選用以下的間隔可以加快Shell排序法的速度:


其中4*(2j)2 + 3*(2j) + 1不可超過元素總數n值,使用上式找出j後代入4*(2j)2 + 3*(2j) + 1求得第一個間隔,然後將2j除以2代入求得第二個間隔,再來依此類推。

後來還有人證明有其它的間隔選定法可以將Shell排序法的速度再加快;另外Shell排序法的概念也可以用來改良氣泡排序法。
public class Sort {
    public static void sort(int[] number) {
        int gap = number.length / 2; 

        while(gap > 0) { 
            for(int k = 0; k < gap; k++) { 
                for(int i = k+gap; i < number.length; i+=gap) { 
                    for(int j = i - gap; j >= k; j-=gap) { 
                        if(number[j] > number[j+gap]) { 
                            swap(number, j, j+gap); 
                        } 
                        else 
                            break; 
                    } 
                } 
            } 

            gap /= 2; 
        } 
    }
    
    private static void swap(int[] number, int i, int j) {
        int t = number[i]; 
        number[i] = number[j]; 
        number[j] = t;
    }
}

分享到:
评论

相关推荐

    C经典算法之Shell 排序法 - 改良的插入排序

    插入排序法由未排序的后半部前端取出一个值,插入已排序前半部...排序要加快的基本原则之一,是让后一次的排序进行时,尽量利用前一次排序后的结果,以加快排序的速度,Shell排序法即是基于此一概念来改良插入排序法。

    C语言经典算法大全(程序员必备).rar

    Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 � 搜寻 循序搜寻法(使用卫兵...

    各种经典算法

    各种经典算法(总有一款...Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的氣泡排序 Heap 排序法 - 改良的選擇排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合併排序法 基數排序法 。。。

    java开发经典算法

    排序方法Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 循序搜寻法(使用卫兵...

    经典常用算法(含代码)

    经典常用算法解析与实现,通过...Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序等

    经典算法大全,常用的算法都在这里

    Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 搜寻 循序搜寻法(使用卫兵...

    C语言经典算法大全(几十个经典案例,都有详尽代码)

    Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 循序搜寻法(使用卫兵)

    蓝桥杯信息学奥赛练习试题

    蓝桥杯信息学奥赛练习试题,几十个必做...Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基

    C-Program-examples.rar_2维码 C语言_c 卡牌游戏_字串核对_背包问题_蒙塔卡罗法

    Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 搜寻 循序搜寻法(使用卫兵) ...

    ifem.zip_Shaker_ifem_ifem编程_择排序_数据结构

    排序 得分排行 x擇,插入,氣泡排序 Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的氣泡排序 Heap 排

    c语言经典算法包括老掉牙,汉诺塔,三色旗

    Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 搜寻 循序搜寻法(使用卫兵) ...

    c语言经典算法

    Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 搜寻 循序搜寻法(使用卫兵) ...

    经典算法教程 举例详解

    Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 搜寻 循序搜寻法(使用卫兵) 二分搜寻...

    C语言经典算法大全

    Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法  搜寻 循序搜寻法(使用卫兵...

    经典算法全部用C语言实现

    Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 搜寻 循序搜寻法(使用卫兵) ...

    C 语言 算法 代码 数据结构

    Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 搜寻 循序搜寻法(使用卫兵) ...

    Java算法大全

    Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 搜寻 循序搜寻法...

    数据结构与算法

    Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 搜寻 循序搜寻法(使用卫兵...

Global site tag (gtag.js) - Google Analytics