希尔排序(图解+代码)

希尔排序


如图: 我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列

图中有10个数,所以第一趟增量就设为10/2=5;看图中第一趟排序,颜色相同为一组,每组进行比较,可以看到,这十个数被分成了五组        [9,4] [1,8] [2,6] [5,3] [7,5],     然后对这五组分别进行直接插入排序

第二趟继续进行,缩小增量为5/2=2;这时候可以看到这些数被分成了两组[4,2,5,8,5] [1,3,9,6,7],继续分别对这两组进行直接插入排序。

第三趟 缩小增量为 2/2=1;这时候,只需要对这些数字进行微调就可以满足要求。

 

希尔排序的代码部分:(C语言版)

#include <stdio.h>
int main(){
	int i=0,gap=0,k=0,j=0,t=0;
	int n=0;
	scanf("%d",&n);     
	int a[n];
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}                                        //输入想要排序的数 
	for(gap=10/2;gap>0;gap=gap/2){           //设置增量,每次都是gap/2;
		for(k=gap;k<10;k++){
			t=a[k];                  //将要插入的数放入t中     
			j=k-gap;
			while(j>=0&&t<a[j]){     //t若比前面位置上的数字小,前面数就要后移
				a[j+gap]=a[j];   //后移
				j=j-gap;         //找到前面一个位置上的数,反正这步我推了好久
			} 
	    a[j+gap]=t;                          //t插入这个位置
	    }
    }
printf("%d",a[0]);                               //就是为了最后不留空格才这样输出
 for(j=1;j<10;j++){
	  printf(" %d ",a[j]);
    }
 return 0;
}

总结:

我们上面选择的增量序列{n/2,(n/2)/2...1}(希尔增量),其最坏时间复杂度依然为O(n2),一些经过优化的增量序列如Hibbard经过复杂证明可使得最坏时间复杂度为O(n3/2)。

  • 12
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是Java希尔排序代码: ```java package totoSort; import java.util.Arrays; public class ShellSort { public static void main(String[] args) { int[] arrays = new int[] {1, 5, 2, 3, 6, 9, 4, 0, 1}; // 实现增量的变化 for(int gap = arrays.length / 2; gap > 0; gap /= 2) { for(int i = gap; i < arrays.length; i++) { for(int j = i - gap; j >= 0; j -= gap) { if(arrays[j > arrays[j + gap]) { int temp = arrays[j]; arrays[j = arrays[j + gap]; arrays[j + gap = temp; } } } } System.out.println(Arrays.toString(arrays)); } } ``` 这段代码使用希尔排序对一个整数数组进行排序希尔排序的核心思想是按照一定的增量分组,对每组使用直接插入排序算法进行排序,随着增量的逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列被分为一组,算法终止。 在这个代码中,首先定义了一个增量`gap`,初始值为数组长度的一半。然后通过不断将`gap`除以2来缩小增量。接着使用嵌套的循环进行排序,外层循环控制增量的变化,内层循环进行插入排序。最后输出排序后的数组。 这种实现方式是希尔排序的一种常见实现方法,其中增量序列{gap=n/2,(n/2)/2,...,1}被称为希尔增量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [java希尔排序(含希尔排序代码)](https://blog.csdn.net/qq_56127002/article/details/126414650)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值