C语言中有着多种排序方法,其中希尔排序便是之一。
希尔排序是什么?怎么写?希尔排序又称”缩小增量排序”,是插入排序的改进版本。
它会将待排序的记录按下标的一定增量分组,随着增量逐渐减少,每组包含关键词
越来越多当增量减至1时,整个文件被分成一组,算法便终止。希尔排序的效率要
高于插入排序算法,但是它是一种不稳定的排序算法。
1.插入排序:
#include<stdio.h> int insort(int s[],int n) /*自定义函数insort() { int i,j; for(i=2;i<=n;i++) //数组下标从2开始,是[0]做监视哨,s[1]一个数据无可比性 {s=[0]=s[i]; //给监视哨赋值 j=i-1; //确定要比较元素的最右边位 while(s[0]<s[j]) {s[j+1]=s[j]; //数据右移 j--; //移向左边一个为比较的数 } s[j+1]=s[0]; //在确定的位置插入s[1] } return 0; } int main() {int a[11],i; printf("请输入10个数据\n"); for(i=1;i<=10;i++) { scanf("%d"&a[i]); } printf("原始顺序\n"); for(i=1;i<11;i++) { printf("%5d",a[i]); } insort(a,10); printf("插入数据排序后顺序\n"); for(i=1;<11;i++) { printf("%5d",a[i]); } printf("\n"); return 0; }
运行结果:
请输入10个数值:
25 12 36 45 2 9 39 22 98 37
插入数据排序后顺序:
2 9 12 22 25 36 37 39 45 98
过程如下:
趟数 监视哨 排序结果
1 25 (25 )12 36 45 2 9 39 22 98 37
2 12 (12 25 )36 45 2 9 39 22 98 37
3 36 (12 25 36 )45 2 9 39 22 98 37
4 45 (12 25 36 45 )2 9 39 22 98 37
5 2 (2 12 25 36 45 )9 39 22 98 37
6 9 (2 9 12 25 36 45 ) 39 22 98 37
7 39 (2 9 12 25 36 39 45 ) 22 98 37
8 22 (2 9 12 22 25 36 39 45 ) 98 37
9 98 (2 9 12 22 25 36 39 45 98 )37
10 37 (2 9 12 22 25 36 37 39 45 98)
算法中放置监视哨是为了避免数据在后面移动时丢失。
2.希尔排序:
#include<stdio.h>
int insort(int s[],int n) /*自定义函数insort()
{ int i,j,d;
d=n/2; //确定固定值
while(d>=1)
{
for(i=d+1;i<=n;i++) //数组下标从d+开始进行插入排序
{s=[0]=s[i]; //监视哨
j=i-d; //确定要进行比较的元素最右边位置
while((j>0)&&(s[0]<s[j]))
{s[j+d]=s[j]; //数据右移
j=j-d; //向左移d个位置
}
s[j+d]=s[0]; //确定位置插入s[i]
}
d=d/2;
}
return 0;
}
int main()
{int a[11],i;
printf("请输入10个数据\n");
for(i=1;i<=10;i++)
{
scanf("%d"&a[i]);
}
printf("原始顺序\n");
for(i=1;i<11;i++)
{
printf("%d",a[i]);
}
insort(a,10);
printf("插入数据排序后顺序\n");
for(i=1;<11;i++)
{
printf("%5d",a[i]);
}
printf("\n");
return 0;
}
技术要求:
希尔排序是自接插入排序的基础上改进,也就是将排序的序列按固定增量分成若干组,等距者在同二组中,然后再组内进行直接插入排序,这里面的固定增量n/2 ,以后每次缩小原来的一半。
3.选择排序
#include <stdio.h> int main() { int i,j,t,a[11]; //定义变量及数组为基本整型 printf("请输入10个数:\n"); for(i=0;i<10;i++) //从键盘中输入10个数 scanf("%d",&a[i]); for( i=0;i<10;i++) //变量i代表比较的趟数 { for(j=i+1;j<10;j++) //变最j代表每趟两两比较的次数 { if(a[i]>a[j]) { int c=a[i]; //产利用中间变童实现两值互换 a[i]=a[j]; a[j]=c; } } } for(int i = 0;i < 10;i++) { printf("%d ",a[i]); } return 0; }
4.冒泡排序
#include <stdio.h> int main() { int i,j,t,a[11]; //定义变量及数组为基本整型 printf("请输入10个数:\n"); for(i=1;i<11;i++) scanf("%d",&a[i]); //从键盘中输入10个数 for(i=1;i<10;i++) //变量i代表比较的趟数 for(j=1;j<11-i;j++) //变最j代表每趟两两比较的次数 if(a[j]>a[j+1]) { t=a[j]; //产利用中间变童实现两值互换 a[j]=a[j+1]; a[j+1]=t; } printf("排序后的顺序是:\n"); for(i=1;i<=10;i++) printf("%5d",a[i]); //将胃泡排序后的顺序输出 printf("\n"); return 0; }
如有错误还请指正,非常感谢!