一组,排序完成 。
下面的函数是一个希尔排序算法的一个实现,初次取序列的一半为增量,
以后每次减半,直到增量为1 。
希尔排序是不稳定的 。
=====================================================
*/
void shell_sort(int *x, int n)
{
int h, j, k, t;
for (h=n/2; h0; h=h/2) /*控制增量*/
{
for (j=h; jn; j++) /*这个实际上就是上面的直接插入排序*/
{
t = *(x+j);
for (k=j-h; (k=0t*(x+k)); k-=h)
{
*(x+k+h) = *(x+k);
}
*(x+k+h) = t;
}
}
}
void main()
{
#define MAX 16
int *p, i, a[MAX];
/*录入测试数据*/
/*
p = a;
printf("Input %d number for sorting :\n",MAX);
for (i=0; iMAX; i++)
{
scanf("%d",p++);
}
*可以自己输入数据
*/
a[] = {503,17,512,908,170,897,275,653,462,154,509,612,677 , 765,703,94};
printf("\n");
//503,17,512,908,170,897,275,653,462,154,509,612,677,765,703 , 94
/*测试排序*/
p = a;
shell_sort(p,MAX);
/**/
for (p=a, i=0; iMAX; i++)
{
printf("%d ",*p++);
}
printf("\n");
system("pause");
}
pascal算法程序:
program xepx;
const n=7;
type
arr=array[1..n] of integer;
var
a:arr;
i,j,t,d:integer;
bool:boolean;
begin
write('input data:');
for i:=1 to n do read(a);
writeln;
d:=n;
while d1 do
begin
d:=d div 2;
for j:=d+1 to n do
begin
t:=a[j];i:=j-d;
while (i0) and (at) do
begin a[i+d]:=a;i:=i-d;end;
a[i+d]:=t;
end;
end;
write('output data:');
for i:=1 to n do write(a:6);
writeln;
end.
希尔排序怎么排啊下标 0123456789
数组 49 38 65 97 26 13 27 50 55 4 (原数组)
增量=5, [0]=49与[5]=13为一组,互换为 13 49 (排序是从小到大)
[1]=38与[6]=27为一组,互换为 27 38
[2]=65与[7]=50为一组,互换为 50 65
[3]=97与[8]=55为一组,互换为 55 97
[4]=26与[9]=4 为一组,互换为 4 26
增量=5的排序结果是: 13 27 50 55 4 49 38 65 97 26
下标0123456789
数组13 27 50 55 449 38 65 97 26 (第一趟之后)
增量=2, [0]=13,[2]=50,[4]=4,[6]=38,[8]=97为一组,
互换之后,[0]=4,[2]=13,[4]=38,[6]=50,[8]=97
[1]=27,[3]=55,[5]=49,[7]=65,[9]=26为一组,
互换之后,[1]=26,[3]=27,[5]=49,[7]=55,[9]=65
增量=2的排序结果是: 4 26 13 27 38 49 50 55 97 65
下标0123456789
数组426 13 27 38 49 50 55 97 65 (第二趟之后)
增量=1, 数组里的10个数据作为一组,其中,
[1]=26有[2]=13互换为 13 26
[8]=97与[9]=65互换为 65 97
增量=1的排序结果是: 4 13 26 27 38 49 50 55 65 97
// C语言测试代码
// 希尔排序法 (自定增量)
#include stdio.h
#include stdlib.h
void printData(int data[],int n) //打印数组
{
int i;
for(i=0;in;i++)
{
printf("%d ",data[i]);
}
printf("\n");
}
//希尔排序(从小到大)
void shell(int data[],int count)
{
int offset_a[3]={5,2,1}; //每一趟的增量
int len;
int pos;
int offset;
int i,j;
int temp;
len=sizeof(offset_a)/sizeof(int);
for(i=0;ilen;i++)
{
offset=offset_a[i];
for(j=offset;jcount;j++)
{
temp=data[j];
pos=j-offset;
while(tempdata[pos]pos=0j=count)
{
data[pos+offset]=data[pos];
pos=pos-offset;
}
data[pos+offset]=temp;
}
printf("增量=%d,排序结果: ",offset);
printData(data,count);
}
}
int main(void)
{
int data[]={49,38,65,97,26,13,27,50,55,4};
推荐阅读
- 单机快乐小游戏,单机游戏快玩
- 怎么初始电脑密码,电脑初始密码忘了怎么办
- 区块链数据连入过程,接入区块链
- 明星都在直播带货,明星都直播带货了怎么样了
- java计算器代码总结 java计算器代码带注释
- flutter全局引用,flutter 全局状态
- 华为nova3e支持鸿蒙,华为nova3能用鸿蒙吗
- 荣耀cpu是什么,荣耀的cpu是什么型号
- Python游标重置函数 python重新定义运算符