C言语编程的排序办法-C / C++-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝26
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:117回复:0

  C言语编程的排序办法

楼主#
更多 发布于:2016-05-21 23:02

数据的排序是学习C言语经常碰到的疑问?所谓排序是指把一组乱七八糟的数依照巨细顺序排列。包含整数、实数、字符及字符串排序。C言语编程中排序的办法许多,?这儿归纳较常用的几种排序办法。它们相同适合于别的高档言语。

Shell排序

Shell排序是以创造者命名的一种较快的排序办法。Shell排序根本算法思维是:将整个无序序列切割成若干小的子序别离进行插入排序。

子序列的切割办法为:将相隔某个增量h的元素构成一个子序列。在排序进程中,逐次减小这个增量,?最终当h减到1时,进行一次插入排序,排序就完结。

在本函数中,增量序列取 ht=2t-1,1 tlog2n其间n为待排序序列的长度。

例:(/* 将输入的数据排序后,输出一个测验Shell排序的主函数*/)

#define SIZE 10

main() {

void shell();

int d[SIZE],i;

printf(“Input %d numbers\n",SIZE);

for(i=0;i

scanf(“%d",&d);

shell(d,SIZE);

printf(“After sort:\n")

for(i=0;i

printf(“%5d",d);

printf(“

");}

/*把数组V的元素按增序排序*/

void shell(v,n)

int v[],n;

{int gap,i,j,temp;

for(gap=n/2;gap>0;gap/=2)

for(i=gap;i

for(j=i-gap;j>=0 && v[j])

v[j+gap];j-=gap)

{ temp=v[j];

v[j]=v[j+gap];

v[j+gap]=temp; }

注:这儿,数组作为函数参数,参数组中元素值的改变就会反过来影响到实参数组。

挑选排序

挑选排序根本算法思维:首要找出最小的元素,然后把这个元素与第一个元素交流,这么值最小的元素就放到了第一个方位;接着,再从剩余的元素中找值最小的,把它和第二个元素交流,使得第二小的元素放在第二个方位上,依此类推,直到一切的值由小到大排列停止。

例: # define NUM 10

main()

{int a[NUM],i,j,r,temp;

printf(“Please input %d number\n",NUM)

for (i=0;i

scanf("%d",&a);

for(i=0;i

r=i;

for(i=i+1;j

if(a

r=j;

if(r!=i)

temp=a;a=a[r];a[r]=temp;} }

printf("The array after sort:\n")

for(i=0;i

printf("%5d",a);

printf("\n"); }

迅速排序

迅速排序是现在运用较好的排序算法,它是由C.A.Hoare创造并命名的。迅速排序根本算法思维:通过一次切割,将无序序列分红两部分,其间前一部分的元素值均不大于后一部分的元素值。然后对每一部分使用相同的办法进行切割,这个进程一向做到每一个子序列的长度小于某个值m停止。

对序列p的切割进程:

首要,在序列的第一个、中间一个及最终一个元素中选择中项,得p(k),并将p(k)赋给t;再将序列中的第一个元素移到p(k)的方位上;然后设置两个指针i和j别离指向序列的开始和最终的方位。

例: void quick(v,n)

int v[],n;

{ void qs();

qs(v,0,n-1);

/*迅速排序,数组计划*/

void qs(v,left,right)

int v[],left,ringt;

{ int i,j,x,temp;

i=left;

v=v[(left+right)/2];

while (i

while(

j--;

if(i<=j){

temp=v;

v=v[j];

v[j]=temp;

i++;

j--; } }

if (left

qs(v,left,j);

if(i

qs(v,i,right); }

注:在这个递归函数比如中,数组V既做为形参数,又做为实践参数。

冒泡排序

冒泡排序根本算法思维:早年到后扫描序列,对比相邻两个项目的巨细,若发现逆序进行交流,最终使最大者换到序列的最终;然后再从后到前扫描剩余的序列,对比相邻两个项目的巨细,若发现逆序则进行交流,最终使最小者换到序列的最前面。对剩余的序列重复上述进程,直到剩余的序列为空止。

例:void ma(p,n)

int P[],n;

{ int m,k,j,i,d;

k=0;m=n-1;

while (k

{ j=m-1;m=0;

for(ik;i<=;i++)

if(p>p[i+1])

{ d=p;p=p[i+1];

p[i+1]=d;m=i;}

j=k+1;k=0;

for(i=m;i>=j;i--)

if (p[i-1]>p)

{d=p[i-1];p=p[i-1];

p[i-1]=d;k=i;} }

return; }

在实践运用上,还常用到堆排序,这儿限于篇幅,不再赘述。

优质IT资源分享社区[font=Tahoma  ]为你提供此文。[font=Tahoma  ]

[font=Tahoma  ]本站有大量优质C、C++教程视频,资料等资源,包含C,C++基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。[font=Tahoma  ]

C、C++教程视频

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客