当前位置:首页 » 编程语言 » 希尔排序代码c语言奇数元素
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

希尔排序代码c语言奇数元素

发布时间: 2022-08-31 02:01:06

㈠ 菜鸟求教c语言希尔排序法

#include<stdio.h>
#include<stdlib.h>
void main(void)
{
int i,y;
FILE *fp;
int a[10],size=10,temp,gap;
fp = fopen("E:\\numb.txt", "r+");//此文件有10个整数
if (fp==NULL)
{
printf("error!");
exit(0);
}

for(i=0; i<10; i++)
{
//fscanf(fp,"%lf",&a[i]);
fscanf(fp,"%d",&a[i]); // 既然是整数,这里应该是%d
}
fclose(fp); // 关闭文件
gap=size/2;
do
{
do
{
y=0;
for(i=0;i<size-gap;i++)
if(a[i]>a[i+gap])
{
temp=a[i];
a[i]=a[i+gap];
a[i+gap]=temp;
y=1;
}

}while(y);
}while(gap=gap/2);
fp = fopen("E:\\numb.txt", "w+"); // 换一种打开方式(w+表示若文件存在,则清空文件内容)
if (fp==NULL)
{
printf("error!");
exit(0);
}

for(i=0;i<10;i++)
{
//fprintf(fp,"%lf",&a[i]);
fprintf(fp, "%d ", a[i]); // 既然是整数,这里应该是%d
}
fclose(fp);
}

㈡ C语言数据结构希尔排序

void main()
{
datatype R[MAXNUM];
int d[6]=[50,25,12,6,3,2,1];

for(int i=0;i<MAXNUM;i++)
scanf("%d",&R[i].key);
ShellSort(R,MAXNUM,d,6);
for(int i=0;i<MAXNUM;i++)
printf("%d",R[i].key);
}

㈢ 希尔排序如何用C语言算法实现呢谢谢@

int shellSort(char alpha[], int number) {
int i, j, gap, temp, rtn=0;

for (gap=number/2; gap>0; gap/=2)
for (i=gap; i<number; i++)
for (j=i; j>0&&alpha[j]<alpha[j+gap]; j-=gap) {
temp = alpha[j];
alpha[j] = alpha[j + gap];
alpha[j + gap] = temp;
rtn++;
}
return rtn;
}

返回交换次数

㈣ 希尔排序(C语言)

假设第一次分组排序后,得到的数据从分别编号为0——9
则第二次分组排序是将编号为0、2、4、6、8的五个数排序,并将编号为1、3、5、7、9的五个数排序。
即:将265、694、438、742、129五个数排序,
再将301、076、863、751、937五个数排序
因为129是第一组五个数里最小的,所以把它排在最前面。
就是这样,建议找本数据结构书把算法重新复习一下。

㈤ C语言希尔排序

#include <stdlib.h>
void xier(int left,int right,int a[],int *times_comp,int *times_eval)
{
int gap=right-left+1,i,j,temp;
do
{
gap=gap/3+1;
for(i=left+gap;i<=right;++i)
if(a[i]<a[i-gap])
{
j=i;temp=a[i];(*times_eval)++;
while(a[j-gap]>temp&&j-gap>=left)
{
a[j]=a[j-gap];(*times_eval)++;
j-=gap;
}
(*times_comp)++;
a[j]=temp;(*times_eval)++;
}
}while(gap>1);
}

int main(void)
{
int i,a[50],times_comp=0,times_eval=0;
printf("Ten random numbers from 0 to 99\n\n");
randomize();
for(i=0; i<50; i++)
a[i]=rand() % 100;
xier(0,49,a, &time_comp, &time_eval);
for(i=0; i<50; i++)
printf("%4d",a[i]);
printf("\n");
printf("The times of compared is %4d.\n",times_comp);
printf("The times of evaluation is %4d.\n",times_eval);
getch();
return 0;
}

㈥ 元素个数为奇数(如:9)时,怎样希尔排序

先考虑步长为3的开始排,把元素分为三组,按顺序排好后,再考虑每组步长为1的排,此时就是简单的插入排序了。如果你不知道什么是希尔排序,你还是去看看书吧。

㈦ 用c语言编写一个希尔排序程序,新手,最好能给注释下!谢谢

网友wang1992092对希尔排序的理解有些错误,希尔排序对每个子序列进行的是直接插入排序,而不是如他所给出的选择排序。你可以先网络一下希尔排序的定义。我这里给一个C源代码,你可以试试。直接插入排序的思路是:将待排表分成两部分,一部分是已有序部分L,另一部分是待排序部分R。L初始化为只含第一个元素的表,因L现在只含一个元素,所以是有序的。然后每次从R中取出最前面的元素到tmp(相当于出队到tmp中),然后在L中从后向前搜索插入位置,边搜索边向后移动比tmp大的元素,找到了插入位置后就将tmp插入到L中。直到R部分为空时结束。
typedef int datatype;
void InsertSort(datatype a[], int left, int right, int gap)
/*对数组a中起始下标为left,结束下标为right,步长为gap的子序列进行直接插入排序,当gap等于1时就是通常的插入排序了*/
{
int tmp, i, j;
for(i = left + gap; i <= right; i += gap){
for(tmp = a[i], j = i - gap; j >= left && a[j] > tmp; j -= gap)
a[j + gap] = a[j];
a[j + gap] = tmp;
}
}

void ShellSort(datatype a[], int left, int right)
{
int gap = (right - left + 1) / 2, i;/*步长gap初始化为n/2取下整*/
while(gap > 0)
{
for(i = left; i < gap; i++) /*对每个子序列进行直接插入排序*/
InsertSort(a, i, right, gap);
gap = gap / 2; /*将步长缩小为原来的一半并取下整*/
}
}