Data Structure
  • 資料結構自學筆記
  • 1 - Stack & Queue
    • 1.1 - Stack
    • 1.2 - Queue
    • 1.3 - Stack and Queue
  • 2 - Tree & Binary Tree
    • 2.1 - Tree
    • 2.2 - Binary Tree
    • 2.3 - Binary Tree Traversal
    • 2.4 - Binary Search Tree
    • 2.5 - Heap
    • 2.6 - Thread Binary Tree
    • 2.7 - Tree and Binary Tree Conversion
    • 2.8 Advanced Trees
      • 2.8.1 - Min-Max Heap
      • 2.8.2 - Deap
      • 2.8.3 - Symmetric Min-Max Heap
      • 2.8.4 - Extended Binary Tree
      • 2.8.5 - AVL Tree
      • 2.8.6 - M-Way Search Tree
      • 2.8.7 - B Tree
      • 2.8.8 - Red-Black Tree
      • 2.8.9 - Optimal Binary Search Tree
      • 2.8.10 - Splay Tree
      • 2.8.11 - Leftest Heap
      • 2.8.12 - Binomial Heap
  • 3 - Search & Sort
    • 3.1 - Searching
    • 3.2 - Elementary Sorting
      • 3.2.1 - Insertion Sort
      • 3.2.2 - Selection Sort
      • 3.2.3 - Bubble Sort
      • 3.2.4 - Shell Sort
    • 3.3 - Sophisticated Sorting
      • 3.3.1 - Quick Sort
      • 3.3.2 - Merge Sort
      • 3.3.3 - Heap Sort
      • 3.3.4 - Radix Sort
      • 3.3.5 - Bucket Sort
      • 3.3.6 - Counting Sort
    • 3.4 - Summary
  • 4 - Graph
    • 4.1 - Intro
    • 4.2 - Graph Traversal
    • 4.3 - Spanning Tree
      • 4.3.1 - Kruskal's algorithm
      • 4.3.2 - Prim's algorithm
      • 4.3.3 - Sollin's algorithm
    • 4.4 - Shortest Path Length
      • 4.4.1 - Dijkstra's algorithm
      • 4.4.2 - Bellman-Ford algorithm
      • 4.4.3 - Floyd-Warshall algorithm
    • 4.5 - AOV Network
    • 4.6 - AOE Network
    • 4.7 - Others
Powered by GitBook
On this page
  • 1. 演算法
  • 2.性質
  1. 3 - Search & Sort
  2. 3.2 - Elementary Sorting

3.2.4 - Shell Sort

1. 演算法

比較第iii筆資料與第i+i+i+span筆資料,若前者大於後者,則兩者交換。

每一回合(每一個span)要做到都沒有發生交換才可以結束。

span的型式: [n2k][\frac{n}{2^k}][2kn​]

void Sort(char *arr){
    int n = strlen(arr);
    int span = n/2;
    int flag = 0;
    while(span >= 1){
        while(flag != n-span){ //判斷是否整個回合都沒有swap
            flag = n - span;
            for (int i = 0; i < n-span; i++){
                if (arr[i] > arr[i+span]){  //swap
                    int temp = arr[i];
                    arr[i] = arr[i+span];
                    arr[i+span] = temp;
                    flag--;
                }
            }
        }
        span/=2;
    }
}

演算法分析:

​input={5,7,8,9,3,1,4,2}​input=\{5,7,8,9,3,1,4,2\}​input={5,7,8,9,3,1,4,2}

span=[n2k]=821=4⇒{3,1,4,2,5,7,8,9}span=[\frac{n}{2^k}]=\frac{8}{2^1}=4 \quad \Rightarrow \{3,1,4,2,5,7,8,9\}span=[2kn​]=218​=4⇒{3,1,4,2,5,7,8,9} ,下一回合沒有發生交換,此回合結束。

span=822=2⇒{3,1,4,2,5,7,8,9}span = \frac{8}{2^2}=2 \quad \Rightarrow \{3,1,4,2,5,7,8,9\}span=228​=2⇒{3,1,4,2,5,7,8,9},下一回合沒有發生交換,此回合結束。

span=823=1⇒{1,3,2,4,5,7,8,9}⇒{1,2,3,4,5,7,8,9}span = \frac{8}{2^3}=1 \quad \Rightarrow \{1,3,2,4,5,7,8,9\} \Rightarrow \{1,2,3,4,5,7,8,9\}span=238​=1⇒{1,3,2,4,5,7,8,9}⇒{1,2,3,4,5,7,8,9},下一回合沒有發生交換,此回合結束。

span=1,shell sort結束。

2.性質

  • Time Complexity:

    • Avg Case: O(n2)O(n^2)O(n2)

    • Worst Case: O(n2)O(n^2)O(n2)

    • Best Case: 和span的形式有關。 O(n32)O(n^{\frac{3}{2}})O(n23​)

  • Space Complexity: O(1)O(1)O(1)

Shell sorting is a unstable sorting method.

Previous3.2.3 - Bubble SortNext3.3 - Sophisticated Sorting

Last updated 6 years ago