排序算法---Shell排序

基本思路:

先把数组分成差量为d 的几组,即:

a[1],a[1+d] ,a[1+d+d] ... 为一组;

a[2],a[2+d] ,a[2+d+d] ... 为一组

然后依次对每组进行插入排序。

各组排完序后 在 取第二个增量d2 < d 重复上述 分组和排序。

直到 增量 d = 1; 即 所有的数都放在同一组中进行插入排序。

下面是 c语言实现

#include <stdio.h>
 
void shellInsertSort(int a[] ,int n){
 	int i,j,d;
 	d = n/2;
 	while(d>=1){
	 	for(i = d+1 ;i<=n ;i++){
	 		j = i-d;
	 		while(j>0){
		 		if(a[j]>a[j+d]){
		 			a[0] = a[j];
		 			a[j] = a[j+d];
		 			a[j+d] = a[0];
		 			j = j-d;
		 		}else{
		 			j = 0;
		 		}
		 	}
	 	}
	 	d=d/2;
 	}
}

void shellSortPass(int a[],int d){
	for(int i = d+1 ;i<=8 ;i++){
		if(a[i]<a[i-d]){
			a[0] = a[i];
			int j = i-d;
			do{
				a[j+d] = a[j];
				j = j-d;
			}while(j>0&&a[0]<a[j]);
			a[j+d] = a[0];
		}
	}
}
void shellSort(int a[]){
	int d = 8;
	do{
		d = d/2;
		shellSortPass(a,d);
	}while(d>1);
	
}
void print(int a[] ,int n)
{
    for (int i = 1;i<n;i++)
    {
        printf("%d  ",a[i]);
    }  
    printf("\n");
}
 
 
int main(int argc, char *argv[])
{
 	int a[]=
    {
        0,59,48,75,98,86,23,37,60
    };
    print(a,9);
    shellSort(a);
    //shellInsertSort(a,9);
    print(a,9);
 	return 0;
}

你可能感兴趣的:(希尔排序,排序算法)