图解希尔排序---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;
}
