㈠ 菜鳥求教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; /*將步長縮小為原來的一半並取下整*/
}
}