1
0
mirror of https://gitlab.com/magicalsoup/Highschool.git synced 2025-02-02 12:51:46 -05:00

Update Shellsort List.md

This commit is contained in:
Pete ._. Mango 2019-11-07 19:55:54 +00:00
parent 491fe8805f
commit 2c0612b30e

View File

@ -1,2 +1,47 @@
|OEIS|General term $`(k \ge 1)`$|Concrete gaps|Worst-case time complexity|Author and year of publication|
|:---|:-------------------------|:------------|:-------------------------|:-----------------------------|
# Shell Sort Handout
## What is shell sort?
- Combination of sorting by insertion (insertion sort) and sorting by exchange (bubble sort)
- Starts off by comparing two elements that are far apart and gradually reduce the gap between them
- It works better than regular insertion sort as it moves certain out of place elements into place faster
## Time Complexity (Shell's Original Sequence):
**Best Case:** $`O(NLogN)`$ <br/>
**Average Case:** $`O(N^\frac{5}{4})`$ <br/>
**Worst Case:** $`O(N^2)`$
## Space Complexity:
The space complexity of shell sort will always be **O(1)** as it does not create another array
## Pros & Cons:
|Pros|Cons|
|:---|:---|
|- Efficient sorting algorithm for medium sized arrays <br/> - Good when memory restraint is tight (Merge and Quicksort will sometimes MLE) <br/> - The fastest non-recursive sorting algorithm <br/> - Much faster than insertion with basically the same amount of code <br/> - Easy to get working and only requires knowledge of iterations and conditional statements|- Heap, merge and quick sort are both more efficient <br/> - Not widely used as it is difficult to understand and implement <br/> - Many people often use the built in version ```Arrays.sort()``` which uses quick sort <br/> - Unstable sorting algorithm (Equal elements will appear in different keys) <br/> - Not as effective for extremely large data sets|
## Gap Sequences:
|General term $`(k \ge 1)`$|Concrete gaps|Worst-case time complexity|Author and year of publication|
|:------------------------:|:-----------:|:------------------------:|:----------------------------:|
|$`\Bigl\lfloor\dfrac{N}{2^K}\Bigr\rfloor`$|$`\dfrac{N}{2}`$, $`\dfrac{N}{4}`$, $`\dfrac{N}{2}`$|O(N^2)|Shell - 1959|
|$`2\Bigl\lfloor\dfrac{N}{2^{k+1}}\Bigr\rfloor+1`$|$`2\Bigl\lfloor\dfrac{N}{4}\Bigr\rfloor+1`$, $`3`$, $`1`$|$`O(N^\frac{3}{2})`$|Franz & Lazarus - 1960|
|$`2^k - 1`$|$`1, 3, 7, 15, 31, 63`$|$`O(N^\frac{3}{2})`$|Hibbard - 1963|
|$`2^k + 1`$|$`3, 5, 9, 17, 33, 65`$|$`O(N^\frac{3}{2})`$|Papernov & Stasevich - 1965|
|$`2^p`$$`3^q`$|$`1, 2, 3, 4, 6, 8, 9`$|$`O(NLog^{2}N)`$|Pratt - 1971|
|$`\dfrac{3^{k}-1}{2}`$|$`1, 4, 13, 40, 121`$|$`O(N^\frac{3}{2})`$|Pratt & Knuth - 1973|
|$`4^k+3\times2^{k-1}+1`$|$`1, 8, 23, 77, 281`$|$`O(N^\frac{4}{3})`$|Sedgewick - 1982|
## Sample Program
```
public static void shellSort(int arr[]) // Method Header
{
for(int gap = arr.length / 2; gap > 0; gap /= 2){ // Loop through the length of the gap sequences
for(int i = gap; i < arr.length; i++){ // Loop through from the gap length to the length of the array
int temp = arr[i], j; // Set the temp variable as the ith element in the array
for(j = i; j >= gap && arr[j - gap] > temp; j -= gap){ // Loop through all the element to swap
arr[j] = arr[j - gap]; // Insert the jth element at the j - gap index
}
arr[j] = temp; // Insert temp at the jth element where the other element was swapped
}
}
}
```