淺析java 希爾排序(Shell)算法
先取一個小于n的整數(shù)d1作為第一個增量,把文件的全部記錄分成d1個組。所有距離為dl的倍數(shù)的記錄放在同一個組中。先在各組內(nèi)進(jìn)行直接插入排序;然后,取第二個增量d2<d1重復(fù)上述的分組和排序,直至所取的增量dt=1(dt<dt-l<;…<d2<d1),即所有記錄放在同一組中進(jìn)行直接插入排序為止。
該方法實質(zhì)上是一種分組插入方法。
原理圖:

源代碼
package com.zc.manythread;
/**
*
* @author 偶my耶
*
*/
public class ShellSort {
public static int count = 0;
public static void shellSort(int[] data) {
// 計算出最大的h值
int h = 1;
while (h <= data.length / 3) {
h = h * 3 + 1;
}
while (h > 0) {
for (int i = h; i < data.length; i += h) {
if (data[i] < data[i - h]) {
int tmp = data[i];
int j = i - h;
while (j >= 0 && data[j] > tmp) {
data[j + h] = data[j];
j -= h;
}
data[j + h] = tmp;
print(data);
}
}
// 計算出下一個h值
h = (h - 1) / 3;
}
}
public static void print(int[] data) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + "\t");
}
System.out.println();
}
public static void main(String[] args) {
int[] data = new int[] { 4, 3, 6, 2, 1, 9, 5, 8, 7 };
print(data);
shellSort(data);
print(data);
}
}
運行結(jié)果:

Shell排序是不穩(wěn)定的,它的空間開銷也是O(1),時間開銷估計在O(N3/2)~O(N7/6)之間
相關(guān)文章
SpringBoot整合Mybatis與druid實現(xiàn)流程詳解
這篇文章主要介紹了springboot整合mybatis plus與druid詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的下伙伴可以參考一下2022-10-10
Mybatis與Jpa的區(qū)別和性能對比總結(jié)
mybatis和jpa兩個持久層框架,從底層到用法都不同,但是實現(xiàn)的功能是一樣的,所以說一直以來頗有爭議,所以下面這篇文章主要給大家介紹了關(guān)于Mybatis與Jpa的區(qū)別和性能對比的相關(guān)資料,需要的朋友可以參考下2021-06-06
mybatis使用foreach語句實現(xiàn)IN查詢(三種)
這篇文章主要介紹了mybatis使用foreach語句實現(xiàn)IN查詢(三種),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Spring復(fù)雜對象創(chuàng)建的方式小結(jié)
這篇文章主要介紹了Spring復(fù)雜對象創(chuàng)建的三種方式,現(xiàn)在使用Spring如何創(chuàng)建這種類型的對象?Spring中提供了三種方法來創(chuàng)建復(fù)雜對象,需要的朋友可以參考下2022-01-01

