图解:https://www.runoob.com/data-structures/shell-sort.html
代码实现:
package _01_sort.cmp;
import java.util.Arrays;
public class _10_Shell {
public void sort(int[] array){
for( int gap = array.length >> 1;gap >= 1; gap = gap >> 1){
//每个gap内有gap组
for(int end = gap ; end <= gap << 1 ; end++){
//插入排序
for(int i = end;i<= array.length -1;i +=gap){
for(int j = i;j>=gap;j-=gap){
if(array[j] < array[j-gap]){
int tmp = array[j];
array[j] =array[j-gap];
array[j-gap] = tmp;
}
}
}
}
}
}
public static void main(String[] args) {
int[] arr = {26,15,23,48,54,2,35,9,20,36,71,32,37,65};
new _10_Shell().sort(arr);
System.out.println(Arrays.toString(arr));
}
}
package _01_sort.cmp;
import _01_sort.Sort;
import java.util.ArrayList;
import java.util.List;
/**
* 希尔排序
*/
public class _10_ShellSortMJ <T extends Comparable<T>> extends Sort<T> {
@Override
protected void sort() {
// 根据元素数量算出步长序列
List<Integer> stepSequence = shellStpSequence();
// 按步长序列划分进行排序
for (Integer step : stepSequence) {
sort(step); // 按step进行排序
}
}
/**
* 分成step列进行排序
*/
private void sort(int step){
// col: 第几列, column的简称
for(int col = 0; col < step; col++){
// 插入排序对每一列进行排序
for(int begin = col + step; begin < array.length; begin += step){
// col、col+step、col+2*step、col+3*step
int cur = begin;
while(cur > col && cmp(cur, cur - step) < 0){
swap(cur, cur - step);
cur -= step;
}
}
}
}
/**
* 希尔本人提出的步长序列
*/
public List<Integer> shellStpSequence(){
List<Integer> stepSequence = new ArrayList<>();
int step = array.length;
while((step >>= 1) > 0){
stepSequence.add(step);
}
return stepSequence;
}
}
【_09_QuickSortMj】
稳定性:false 耗时:0.005s(5ms) 比较:32.30万 交换:1.25万
------------------------------------------------------------------
【_08_MergeSort】
稳定性:true 耗时:0.006s(6ms) 比较:26.10万 交换:0
------------------------------------------------------------------
【_08_MergeSort2】
稳定性:true 耗时:0.006s(6ms) 比较:26.10万 交换:0
------------------------------------------------------------------
【_09_QuickSort】
稳定性:false 耗时:0.006s(6ms) 比较:46.36万 交换:0
------------------------------------------------------------------
【_10_ShellSort2】
稳定性:true 耗时:0.01s(10ms) 比较:60.86万 交换:35.86万
------------------------------------------------------------------
【_10_ShellSortMJ】
稳定性:true 耗时:0.01s(10ms) 比较:60.86万 交换:35.86万
------------------------------------------------------------------
【_03_HeapSort】
稳定性:false 耗时:0.011s(11ms) 比较:51.08万 交换:2.00万
------------------------------------------------------------------
【_05_Insert_BinarySearch】
稳定性:true 耗时:0.267s(267ms) 比较:26.07万 交换:0
------------------------------------------------------------------
【_02_Select】
稳定性:true 耗时:0.394s(394ms) 比较:2.00亿 交换:2.00万
------------------------------------------------------------------
【_04_Insert】
稳定性:true 耗时:0.566s(566ms) 比较:9943.17万 交换:9941.17万
------------------------------------------------------------------
【_04_Insert2】
稳定性:true 耗时:0.584s(584ms) 比较:1.47亿 交换:0
------------------------------------------------------------------
【_01_Bubble】
稳定性:true 耗时:1.279s(1279ms) 比较:2.00亿 交换:9941.17万
------------------------------------------------------------------
【_01_Bubble_3】
稳定性:true 耗时:1.829s(1829ms) 比较:2.00亿 交换:9941.17万
------------------------------------------------------------------
【_01_Bubble_2】
稳定性:true 耗时:1.849s(1849ms) 比较:2.00亿 交换:9941.17万
------------------------------------------------------------------
【_10_ShellSort】
稳定性:true 耗时:2.31s(2310ms) 比较:6.59亿 交换:0
------------------------------------------------------------------
Process finished with exit code 0
不知道为什么我写的for循环很慢,mj的就很快
package _01_sort.cmp;
import _01_sort.Sort;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class _10_ShellSort2<T extends Comparable<T>> extends Sort<T> {
public List<Integer> shellStpSequence(){
List<Integer> stepSequence = new ArrayList<>();
int step = array.length;
while((step >>= 1) > 0){
stepSequence.add(step);
}
return stepSequence;
}
protected void sort() {
// 根据元素数量算出步长序列
List<Integer> stepSequence = shellStpSequence();
// 按步长序列划分进行排序
for (Integer step : stepSequence) {
sort(step); // 按step进行排序
}
}
public void sort(int step){
//每个gap内有gap组
// for(int end = 0 ; end <= step ; end++){
// //插入排序
// for(int i = end + step ; i<= array.length -1;i += step){
// for(int j = i;j>=step;j-=step){
// if(cmp(j , j-step) < 0){
// swap(j,j-step);
// }
// }
// }
// }
for(int col = 0; col < step; col++){
// 插入排序对每一列进行排序
for(int begin = col + step; begin < array.length; begin += step){
// col、col+step、col+2*step、col+3*step
int cur = begin;
while(cur > col && cmp(cur, cur - step) < 0){
swap(cur, cur - step);
cur -= step;
}
}
}
}
}