图解希尔排序---C实现

希尔排序又称 “缩小增量排序” 它也是一种插入类排序的方法。

希尔排序原理:

希尔排序属于插入类排序,是 将整个有序序列分割成若干小的子序列分别进行 插入排序。

希尔排序示意图:

以“gap”为间距,将原数组分为若干部分,每一部分都进行插入排序。“gap”初始为原数组长度的一半,进而gap=gap/2。(图片来自百度图片) 要想完成数据排序必须在最后执行gap=1,即普通的插入排序法。不过此时对象数据顺序应该已经很整齐了。

C实现希尔排序:

#include <stdio.h>
#include <stdlib.h>

//希尔排序 

void shellSort(int array[], int length){
          
   
	int i,j,k,gap,temp;
	
	for(gap=length/2; gap>0; gap=gap/2){
          
      //以gap将数组分割
		for(i=0; i<gap; i++){
          
      //分割后的第一个元素
			for(j=i+gap; j<length; j=j+gap){
          
   	//进行插入排序
				if(array[j] < array[j - gap]){
          
   
					temp = array[j];
					k = j - gap;
					while(k>=0 && array[k]>temp){
          
      //只要该元素小,则较大的向后移动,该元素向前移动
						array[k + gap] = array[k];
						k = k - gap;
					}
					array[k + gap] = temp;
				}
			}
		}
	}
}

int main(int argc, char *argv[]) {
          
   
	int a[100],n,i;
	
	printf("请输入有几个数:");
	scanf("%d",&n);
	printf("请输入这几个数:");
	for(i=0;i<n;i++)
	{
          
   
		scanf("%d",&a[i]);
	}
	
	shellSort(a,n);   //希尔排序
	
	for(i=0;i<n;i++)  //将排序后的数组输出
	{
          
   
		if(i>0) printf(" ");   //从下标1开始,元素之前输出输出空格隔开
		printf("%d",a[i]);
	}
	return 0;
}
经验分享 程序员 微信小程序 职场和发展