shell排序

eeetttzhangji eeetttzhangji 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
用shell排序的方法对奥运金牌榜进行排序(多关键字),我严格按照shell排序的模板写的,可就是不对,麻烦给看一下哪里错了。

[code=c#include<stdio.h>
#include<string.h>


struct medal
{
char name[10];
int gold;
int sliv;
int bron;
};

int comp(const void *a,const void *b);
void swap(char *a,char *b,int width);
void shellsort(void *x,int n,int size,int (*fcmp)(const void *a,const void *b));
void Print(struct medal a[],int n);
int main()
{
struct medal country[10]={
{"Japan",1,3,1},
{"America",8,3,1},
{"Germany",2,5,6},
{"England",3,2,5},
{"France",4,8,6},
{"Canada",2,6,0},
{"Korea",5,3,6},
{"Australia",3,2,6},
{"India",1,3,1},
{"China",8,3,1}
};
shellsort(country,10,sizeof(country[0]),comp);
Print(country,10);
return 0;
}

int comp(const void *a,const void *b)
{
struct medal *pa;
struct medal *pb;
pa=(struct medal *)a;
pb=(struct medal *)b;

if(pa->gold != pb->gold)
return pa->gold - pb->gold;

if(pa->sliv != pb->sliv)
return pa->sliv - pb->sliv;

if(pa->bron != pb->bron)
return pa->bron - pb->bron;

return strcmp(pb->name,pa->name);
}

void swap(char *a,char *b,int width)
{
if(a!=b)
{
while(width--){
*b=*a;
a++;
b++;
}
}
}

void shellsort(void *x,int n,int size,int (*fcmp)(const void *,const void *))
{
struct medal temp;
struct medal *tp ,*gp,*gq;
tp=(struct medal *)x;
int gap,gapwidth,i;
char *p,*q;
p=(char *)x;
for(gap=n/2;gap>=1;gap/=2)
{
for(i=gap;i<n;i++)
{
temp=tp[i];
gapwidth=gap*size;
for(q=p+(i-gap)*size; q>=p && comp(p+i*size,q)>0 ; q-=gapwidth)
swap(q,q+gapwidth,size);
gp=(struct medal *)(q+gapwidth);
strcmp(gp->name,temp.name);
gp->gold=temp.gold;
gp->sliv=temp.sliv;
gp->bron=temp.bron;

}
}
}

void Print(struct medal a[],int n)
{
int i;
printf("\n 国家 金牌 银牌 铜牌 \n");

for(i=0;i<n;i++)
{
printf("%10s%8d%8d%8d\n",a[i].name,a[i].gold,a[i].sliv,a[i].bron);
}
}][/code]
...全文

相关推荐

C语言基本排序算法之shell排序实例

本文实例讲述了C语言基本排序算法之shell排序。分享给大家供大家参考,具体如下: shell排序是对直接插入方法的改进方法. /*------------------------------------------------------------------------------------- Shell_sort.h shell排序是对直接插入方法的改进,它并不是对相邻元素进行比较,而是对一定间隔的元素比较. 选择增量序列的几种方法:(为方便,本例采用第一种增量序列) 1. h[1]=size, h[k] = h[k-1]/2. 最坏运行时间为O(N^2). 最坏情形:数组

weixin_38635996

解析shell排序的实现代码

本篇文章是对shell排序的实现代码进行了详细的分析介绍,需要的朋友参考下

weixin_38656400

Shell中字符串排序的几种方法

今天小编就为大家分享一篇关于Shell中字符串排序的几种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

weixin_38686080

C 冒泡Shell排序算法

冒泡 插入 选择排序

奈何桥旁人

C++的Shell排序算法代码学习

c++ 语言的应用#include   using namespace std;   template   void ShellInsert(T a[],size_t a_size,size_t dk)   {   for(int i=dk;i!=a_size;++i){   cout<<i<<endl;   if(a[i]=0 && temp<a[j];j-=dk){   a[j+dk]=a[j];   }   a[j+dk]=temp;   }   }   }   template   void ShellSort(T a[],size_t a_size,size_t dlta[],size_t dlta_size)   {   for(int i=0;i!=dlta_size;++i)   ShellInsert(a,a_size,dlta[i]);   }   int main()   {   int inta[]={7,1,3,4,5,10,2,6,9,8};   int intb[]={49,38,65,97,76,13,27,49,55,4};   size_t dlta[]={5,3,2,1};   cout<<\"The sorted result:\"<<endl;   ShellSort(inta,10,dlta,4);   for(size_t i=0;i!=10;++i)   {   cout<<inta[i]<<\" \";   }   return EXIT_SUCCESS;   }

woaini7522
评论 3
收藏 已收藏
分享
返回顶部