/*
希尔排序
在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。
希尔排序是不稳定的,其时间复杂度为O(n ^2)。
*/
public class ShellSort{
public static void main(String[] args){
// int[] array = {49,38,65,97,76,13,27};
int[] array = {49,38,65,97,76,13,27,49,55,04};
// shellSort(array,array.length);
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
}
/*
public static void shellSort(int[] arr,int length){
int h;
while(arr.length/3>h){
h = h*3+1;
}
while(h>0){
for(int i=h;i>0;i++){
int temp = arr[i];
int j =i;
while(j >h-1 && arr[j-h]>temp ){
arr[j] = arr[j-h];
j -=h;
}
arr[j] = temp;
}
h=(h-1)/3;
}
}
*/
/*
public static void shellSort(int[] array,int length){
int increment=length/2; //增量初值,不妨设n>0
do {
shellPass(array,increment,length);//一趟增量为increment的Shell插入排序
increment=increment/3+1;//求下一增量
}while(increment>1);
} //ShellSort
public static void shellPass(int[] array,int d,int length){//希尔排序中的一趟排序,d为当前增量
for(int i=d+1;i<length;i++) //将R[d+1..n]分别插入各组当前的有序区
if(array[i]<array[i-d]){
array[0]=array[i];
int j=i-d;//R[0]只是暂存单元,不是哨兵
do {//查找R[i]的插入位置
array[j+d]=array[j];//后移记录
j=j-d;//查找前一记录
}while(j>0&&array[0]<array[j]);
array[j+d]=array[0]; //插入R[i]到正确的位置上
} //endif
} //ShellPass
*/
/*
//希尔排序, array要排序的数据, len数据的个数
public static void shellSort(int[] array, int len){
//以step分组,step每次减为原来的一半。
for (int step = len / 2; step > 0; step /= 2){
//对每个组进行排序
for (int i = 0 ;i < step; i++){
sortGroup(array, len, i, step);
}
}
}
public static void sortGroup(int[] array, int len, int start,int step){
for (int i = start + step; i < len; i += step){
//寻找i元素的位置,
for (int j = start; j < i; j+= step){
//如果比他小,则这里就是他的位置了
if (array[j]>array[i]){
int nTemp = array[i];
for (int k = i; k > j; k -= step){
array[k] = array[k - step];
}
array[j] = nTemp;
}
}
}
}
public static void shellSort2(int arr[], int n){
int i, j;
int key;
int h;
for (h = 1; h <= (n-1)/9; h = 3*h + 1)
for (; h > 0; h /= 3)
for (i = h; i < n; i++){
key = arr[i];
j = i;
while ((j >= h) && (arr[j-h] > key)){
arr[j] = arr[j-h];
j -= h;
}
arr[j] = key;
}
}
*/
}
分享到:
相关推荐
希尔排序,由Donald Shell在1959年提出,是一种基于插入排序的快速排序方法,其主要通过设置间隔序列(也称为增量序列)来优化插入排序的过程,从而提高整体的排序效率。它属于不稳定排序算法,因为在排序过程中可能...
希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一个增量序列分成若干个子序列,然后分别对子序列进行插入排序,最后再进行一次整体的插入...
希尔排序(Shell Sort)是一种基于插入排序的高效排序算法,由Donald Shell于1959年提出。它的核心思想是通过设置一系列的增量序列来逐步减少元素间的距离,从而优化插入排序的过程。希尔排序的基本步骤如下: 1. **...
希尔排序(Shell Sort)是一种基于插入排序的算法,它的主要思想是通过设定一系列的增量(gap)来分组数组中的元素,对每个分组进行插入排序,随着增量逐渐减小,最终增量为1,完成整个排序过程。这种方法使得大规模...
希尔排序,又称希尔斯排序,是由美国计算机科学家Donald Shell于1959年提出的一种改进的插入排序算法。它的主要思想是将待排序的数组元素按某个增量分组,然后对每组进行直接插入排序。随着增量逐渐减少,每组包含的...
希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一个增量序列分成若干个子序列,然后分别对每个子序列进行插入排序,最后再进行一次全局的...
希尔排序算法作为提高排序效率的一种方式,以其独特的分组插入排序思想,在众多排序算法中占有重要地位。希尔排序是一种基于插入排序的算法,它通过将原始数据分割为多个子序列分别进行插入排序,可以有效地减少数据...
希尔排序
希尔排序是一种基于插入排序的快速排序算法,由美国计算机科学家Donald Shell在1959年提出。它的主要思想是将待排序的元素按照一定的增量序列进行分组,然后对每组内部进行插入排序,随着增量逐渐减少,每组包含的...
希尔排序 希尔排序 希尔排序 希尔排序 希尔排序
希尔排序(Shell Sort)是一种插入排序的改进版,由Donald Shell于1959年提出。它的基本思想是将待排序的数据序列按照一个增量序列进行分组,然后在每组内部进行插入排序,随着增量逐渐减少,每组包含的关键词越来越...
希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一定的增量分组,对每组使用直接插入排序,然后逐渐减小增量,重复这个过程,直到增量为1...
希尔排序,又称希尔斯排序,是由美国计算机科学家Donald Shell于1959年提出的一种基于插入排序的快速排序算法。这种排序方法通过设置一个增量序列,将待排序数组分割成若干个子序列,然后对每个子序列进行插入排序。...
### Python排序搜索基本算法之希尔排序实例分析 #### 希尔排序简介 希尔排序(Shell Sort)是一种基于插入排序的高效算法。它通过将原始数组分割成多个子数组,并分别对这些子数组进行插入排序,从而提高了排序的...
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,...
希尔排序算法是一种基于插入排序改进的算法,由Donald Shell于1959年提出。其基本思想是在进行直接插入排序的基础上,通过引入间隔的概念来减少元素移动的次数,从而提高效率。在直接插入排序中,每个元素需要与它...
希尔排序(Shell Sort)是一种改进的插入排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的元素按照一定的间隔分组,然后对每组进行插入排序,随着间隔逐渐减小,直到间隔为1,即所有元素都在同一组,...
本文实例为大家分享了C++实现希尔排序的具体代码,供大家参考,具体内容如下 一、思路: 希尔排序:又称缩小增量排序,是一种改进的插入排序算法,是不稳定的。 设排序元素序列有n个元素,首先取一个整数gap using ...
希尔排序是一种基于插入排序的快速排序算法,由Donald Shell在1959年提出。它通过设置一个间隔序列,将待排序的数组分为若干个子序列,然后对每个子序列进行插入排序,随着间隔序列逐渐减小,最终完成整个数组的排序...