希爾排序法在插入排序法的基礎上添加了間距(gap)的概念,使得插入排序法可以分組執行,並且元素的移動距離可以大於一。希爾排序法會對序列由大至小,小則至1,來選擇應用在插入排序法上的間距,這樣一來就可以讓序列後端比較小的元素,在被使用前面幾次的大間距插入排序法排序之後,就先被移動到較前端的位置,使它們在最後的快速排序法中,不需要大老遠的從後端以一次一個索引距離的方式來移動到前端。
/// 希爾排序法(遞增)。
pub fn shell_sort(array: &mut [i32], gaps: &[usize]) {
let length = array.len();
for gap in gaps.iter().copied() {
'outer: for i in gap..length {
let temp = array[i];
let mut j = i - gap;
while temp < array[j] {
array[j + gap] = array[j];
if j < gap {
array[j] = temp;
continue 'outer;
}
j -= gap;
}
array[j + gap] = temp;
}
}
}
/// 希爾排序法(遞減)。
pub fn shell_sort_desc(array: &mut [i32], gaps: &[usize]) {
let length = array.len();
for gap in gaps.iter().copied() {
'outer: for i in gap..length {
let temp = array[i];
let mut j = i - gap;
while temp > array[j] {
array[j + gap] = array[j];
if j < gap {
array[j] = temp;
continue 'outer;
}
j -= gap;
}
array[j + gap] = temp;
}
}
}
至於間距到底要怎麼設定才會是最快的,就得看要排序什麼樣的資料啦!目前已知的間距最佳通用值,是Marcin Ciura找出來的,如下:
pub const CIURA_GAPS: [usize; 9] = [1750, 701, 301, 132, 57, 23, 10, 4, 1];
/**
* 希爾排序法(遞增)。
*/
public static void shellSort(final int[] array, final int[] gaps) {
for (final int gap : gaps) {
for (int i = gap; i < array.length; ++i) {
final int temp = array[i];
int j = i - gap;
while (j >= 0 && temp < array[j]) {
array[j + gap] = array[j];
j -= gap;
}
array[j + gap] = temp;
}
}
}
/**
* 希爾排序法(遞減)。
*/
public static void shellSortDesc(final int[] array, final int[] gaps) {
for (final int gap : gaps) {
for (int i = gap; i < array.length; ++i) {
final int temp = array[i];
int j = i - gap;
while (j >= 0 && temp > array[j]) {
array[j + gap] = array[j];
j -= gap;
}
array[j + gap] = temp;
}
}
}
至於間距到底要怎麼設定才會是最快的,就得看要排序什麼樣的資料啦!目前已知的間距最佳通用值,是Marcin Ciura找出來的,如下:
public static int[] CIURA_GAPS = new int[]{1750, 701, 301, 132, 57, 23, 10, 4, 1};
/**
* 希爾排序法(遞增)。
*/
function shellSort(array: number[], gaps: number[]) {
for (const gap of gaps) {
for (let i = gap;i < array.length;++i) {
const temp = array[i];
let j = i - gap;
while (j >= 0 && temp < array[j]) {
array[j + gap] = array[j];
j -= gap;
}
array[j + gap] = temp;
}
}
}
/**
* 希爾排序法(遞減)。
*/
function shellSortDesc(array: number[], gaps: number[]) {
for (const gap of gaps) {
for (let i = gap;i < array.length;++i) {
const temp = array[i];
let j = i - gap;
while (j >= 0 && temp > array[j]) {
array[j + gap] = array[j];
j -= gap;
}
array[j + gap] = temp;
}
}
}
至於間距到底要怎麼設定才會是最快的,就得看要排序什麼樣的資料啦!目前已知的間距最佳通用值,是Marcin Ciura找出來的,如下:
const CIURA_GAPS = [1750, 701, 301, 132, 57, 23, 10, 4, 1];
// 希爾排序法(遞增)。
func ShellSort(array []int, gaps []int) {
length := len(array)
for _, gap := range gaps {
for i := gap; i < length; i += 1 {
temp := array[i]
j := i - gap
for j >= 0 && temp < array[j] {
array[j+gap] = array[j]
j -= gap
}
array[j+gap] = temp
}
}
}
// 希爾排序法(遞減)。
func ShellSortDesc(array []int, gaps []int) {
length := len(array)
for _, gap := range gaps {
for i := gap; i < length; i += 1 {
temp := array[i]
j := i - gap
for j >= 0 && temp > array[j] {
array[j+gap] = array[j]
j -= gap
}
array[j+gap] = temp
}
}
}
至於間距到底要怎麼設定才會是最快的,就得看要排序什麼樣的資料啦!目前已知的間距最佳通用值,是Marcin Ciura找出來的,如下:
var CIURA_GAPS = []int{1750, 701, 301, 132, 57, 23, 10, 4, 1}