导航:首页 > 源码编译 > 程序排序计算法

程序排序计算法

发布时间:2022-05-02 01:43:57

㈠ 什么是排序法

排序法是指根据被评估员工的工作绩效进行比较,从而确定每一员工的相对等级或名次。等级或名次可从优至劣或由劣到优排列。比较标准可根据员工绩效的某一方面(如:出勤率、事故率、优质品率)确定,一般情况下是根据员工的总体工作绩效进行综合比较。

㈡ 求排序算法的发展史

对于今天排序技术的探索可以追溯到19世纪,美国人口统计局的Herman Hollerith发明了第一批具有排序装置的制表机,成功地应用到1890年的美国人口普查。关于Hollerith及其制表机的故事,Leon E. Truesdell曾在【The Development of Punch Card Tabulation(Washington: U. S. Bureau of the Census, 1965)】中进行了有趣而详尽地描述。

排序例程曾经是为存储程序式计算机编写的第一个程序,因为它集中体现了计算机潜在的非数值应用。冯·诺伊曼在1954年为了检验EDVAC计算机指令代码的适用性以及评价他所建议的计算机组织的优点,编写了内部归并排序程序,Knuth在【Computing Surveys 2(1970), 247~260】中描述了这个发展细节。

在德国,K. Zuse于1945年独立编写了用于直接插入排序的程序,作为他的Plankalkul语言中线性表操作的例子之一,这一开创性的工作推迟了近30年才发表。

1946年在穆尔学校举行的有关计算的专题讨论会上,John Mauchly作了“排序和整理”的演讲,是第一个公开发表的关于计算机排序的讨论,包括直接插入排序和折半插入排序。

到1952年左右,内部排序的许多方法已在程序设计领域广为流传,但理论上的研究却相对很少。Daniel Goldenberg用Whirlwind计算机编写了5个不同方法的排序程序,分别就最好情况和最坏情况进行了分析。

由Howard B. Demuth于1956年撰写的博士论文【Electronic Data Sorting. Stanford University, 1956】可以说是一篇非常值得关注的论文,因为这篇论文有助于奠定计算复杂性理论的基础。论文利用循环的、线性的以及随机的存储器,考虑了排序问题的3个抽象模型,并对每个模型提出了最优(或接近最优)的方法。Demuth的论文建立了如何把理论同实践相联系的重要思想。

事实上,计算的大多数早期历史都出现在比较难以得到的报告中,因为那时仅有少数人同计算机打交道。有关排序文献的第一次付印是在1955年,用的是三篇重要的综述性文章。第一篇文章是由J. C. Hosken撰写的【Proc. Eastern Joint Computer Conference 8(1955), 39~55】,综述了在计算机上进行排序的方法,以及所有可利用的专用设备,文中的54项参考文献大多数是以厂家的手册为基础的。第二篇文章是由E. H. Friend撰写的【Sorting on Electronic Computer Systems. Journal of the ACM 3(1956), 134~168】是排序技术发展史的一个重要里程碑,Friend对相当多的内部和外部排序算法给出了细致的描述。第三篇文章是由D. W. Davies撰写的【Proc. Inst. Elec. Engineers 103B, Supplement 1(1956), 87~93】。

1962年11月ACM主持召开了一次关于排序的研讨会,在会上宣读的大多数论文都发表在COMMUNICATIONS OF THE ACM1963年5月的刊物上,这些论文是当时技术发展水平的很好代表。

㈢ 程序的排序算法都有那几种

1
插入排序
2快速排序
3选择排序
4归并排序
5基数排序
具体的你可以参照以下网址
http://shi..com/shi/233776.html

㈣ 关于c语言排序算法

没有错误啊!
你写的是10个数据从小到大的选择排序算法!
我这里成功运行。

㈤ 如何用C语言编写一个排序程序

楼上的用的是C++
若单纯的用C那就是这样
#include<stdio.h>
#define
print
"NO.%d
%d
%d
%d
%d
%3.2f
%3.2f\n",1+i,stu[i].num,stu[i].mat,stu[i].ENG,stu[i].com,stu[i].aver,stu[i].total//宏定义节约时间
struct
student
{
int
num;
int
mat;
int
ENG;
int
com;
float
aver;
float
total;
}stu[10];//定义结构体变量
void
main()
{
int
i;
void
take_turn_print(struct
student
stu1[10])
;
float
sum(int
x,int
y,int
z);//声明求和函数
for(i=0;i<10;i++)
scanf("%d%d%d%d",&stu[i].num,&stu[i].mat,&stu[i].ENG,&stu[i].com);
for(i=0;i<10;i++)
{
stu[i].total=sum(stu[i].mat,stu[i].ENG,stu[i].com);//调用求和函数
stu[i].aver=stu[i].total/3;
}
take_turn_print(stu);//调用排序
打印函数
}
void
take_turn_print(struct
student
stu1[10])
{
void
change(int
*x,int
*y);//声明换位函数
void
change1(float
*x,float
*y);//声明换位函数
int
i,j;
for(j=0;j<9;j++)//冒泡排序
为理解简单
就没用别的排序方法
哈哈
{
for(i=0;i<9-j;i++)
{
if(stu1[i].aver<stu1[i+1].aver)
{
change(&stu1[i].num,&stu1[i+1].num);//
值交换
change(&stu1[i].mat,&stu1[i+1].mat);//
值交换
change(&stu1[i].ENG,&stu1[i+1].ENG);//
值交换
change(&stu1[i].com,&stu1[i+1].com);//
值交换
change1(&stu1[i].aver,&stu1[i+1].aver);//
值交换
change1(&stu1[i].total,&stu1[i+1].total);//
值交换
}
}
}
for(i=0;i<10;i++)
printf(print);//打印
}
void
change(int
*x,int
*y)
{
int
i;
i=*x;
*x=*y;
*y=i;//利用指针做变量替换
}
void
change1(float
*x,float
*y)
{
float
i;
i=*x;
*x=*y;
*y=i;//利用指针做变量替换
}
float
sum(int
x,int
y,int
z)
{
float
i;
i=(float)(x+y+z);
return(i);
}
前几天也是帮同学做这样的题
一模一样
看来你也是WH大学的

㈥ C语言中的排序法

c语言中排序法有选择法和冒泡法是最常见的。
1冒泡法对10个数排序
#include<stdio.h>
void main ()
{ int a[10];
int i,j,t;
printf("please input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<9;j++) //进行9次循环,实现9次比较
for(i=0;i<9-j;j++) //在每一次比较中在进行9-j次比较
if(a[i]>a[i+1]) //相邻两数比较大的下沉即交换
{t=a[i+1];
a[i+1]=a[i];
a[i]=t;
}
printf("the sorted numbers :\n");
for(i=0;i<10;i++)
printf("%d",a[i]);
printf("\n");
}
不管有多少数只要改变一下都可以实现功能。定义一个大的数组,用多次循环就可以实现。
2选择法对10个数排序
此法没有冒泡法方便不在叙述 。

㈦ c++几种常见的排序程序

(1)“冒泡法”

冒泡法大家都较熟悉。其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]>a[i],则交换它们,一直比较到a[n]。同理对a[1],a[2],...a[n-1]处理,即完成排序。下面列出其代码:

void bubble(int *a,int n) /*定义两个参数:数组首地址与数组大小*/

{

int i,j,temp;

for(i=0;i<n-1;i++)

for(j=i+1;j<n;j++) /*注意循环的上下限*/

if(a[i]>a[j]) {

temp=a[i];

a[i]=a[j];

a[j]=temp;

}

}

冒泡法原理简单,但其缺点是交换次数多,效率低。

下面介绍一种源自冒泡法但更有效率的方法“选择法”。

(2)“选择法”

选择法循环过程与冒泡法一致,它还定义了记号k=i,然后依次把a[k]同后面元素比较,若a[k]>a[j],则使k=j.最后看看k=i是否还成立,不成立则交换a[k],a[i],这样就比冒泡法省下许多无用的交换,提高了效率。

void choise(int *a,int n)

{

int i,j,k,temp;

for(i=0;i<n-1;i++) {

k=i; /*给记号赋值*/

for(j=i+1;j<n;j++)

if(a[k]>a[j]) k=j; /*是k总是指向最小元素*/

if(i!=k) { /*当k!=i是才交换,否则a[i]即为最小*/

temp=a[i];

a[i]=a[k];

a[k]=temp;

}

}

}

选择法比冒泡法效率更高,但说到高效率,非“快速法”莫属,现在就让我们来了解它。

(3)“快速法”

快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。下面分析其代码:

void quick(int *a,int i,int j)

{

int m,n,temp;

int k;

m=i;

n=j;

k=a[(i+j)/2]; /*选取的参照*/

do {

while(a[m]<k&&m<j) m++; /* 从左到右找比k大的元素*/

while(a[n]>k&&n>i) n--; /* 从右到左找比k小的元素*/

if(m<=n) { /*若找到且满足条件,则交换*/

temp=a[m];

a[m]=a[n];

a[n]=temp;

m++;

n--;

}

}while(m<=n);

if(m<j) quick(a,m,j); /*运用递归*/

if(n>i) quick(a,i,n);

}

(4)“插入法”

插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。

void insert(int *a,int n)

{

int i,j,temp;

for(i=1;i<n;i++) {

temp=a[i]; /*temp为要插入的元素*/

j=i-1;

while(j>=0&&temp<a[j]) { /*从a[i-1]开始找比a[i]小的数,同时把数组元素向后移*/

a[j+1]=a[j];

j--;

}

a[j+1]=temp; /*插入*/

}

}

(5)“shell法”

shell法是一个叫 shell 的美国人与1969年发明的。它首先把相距k(k>=1)的那几个元素排好序,再缩小k值(一般取其一半),再排序,直到k=1时完成排序。下面让我们来分析其代码:

void shell(int *a,int n)

{

int i,j,k,x;

k=n/2; /*间距值*/

while(k>=1) {

for(i=k;i<n;i++) {

x=a[i];

j=i-k;

while(j>=0&&x<a[j]) {

a[j+k]=a[j];

j-=k;

}

a[j+k]=x;

}

k/=2; /*缩小间距值*/

}

}

上面我们已经对几种排序法作了介绍,现在让我们写个主函数检验一下。

#include<stdio.h>

/*别偷懒,下面的"..."代表函数体,自己加上去哦!*/

void bubble(int *a,int n)

{

...

}

void choise(int *a,int n)

{

...

}

void quick(int *a,int i,int j)

{

...

}

void insert(int *a,int n)

{

...

}

void shell(int *a,int n)

{

...

}

/*为了打印方便,我们写一个print吧。*/[code]

void print(int *a,int n)

{

int i;

for(i=0;i<n;i++)

printf("%5d",a[i]);

printf("\n");

}

main()

{ /*为了公平,我们给每个函数定义一个相同数组*/

int a1[]={13,0,5,8,1,7,21,50,9,2};

int a2[]={13,0,5,8,1,7,21,50,9,2};

int a3[]={13,0,5,8,1,7,21,50,9,2};

int a4[]={13,0,5,8,1,7,21,50,9,2};

int a5[]={13,0,5,8,1,7,21,50,9,2};

printf("the original list:");

print(a1,10);

printf("according to bubble:");

bubble(a1,10);

print(a1,10);

printf("according to choise:");

choise(a2,10);

print(a2,10);

printf("according to quick:");

quick(a3,0,9);

print(a3,10);

printf("according to insert:");

insert(a4,10);

print(a4,10);

printf("according to shell:");

shell(a5,10);

print(a5,10);

}

㈧ 程序设计中有哪些排序算法用C语言分别怎样实现

冒泡排序法,折半查找法。折半是有一定的顺序的中找,利用折半减少查找次数。
、没优化的冒泡我就不说了,优化的说是拿第一个元素跟后面的一个个比较,大的或小的放到第一个,这样第一次比较出来的就是最大的或最小的,然后第二个在跟后面的元素一个个比较,找出第二大或第二小,依此到完,用到二个FOR循环。

㈨ 谁能帮我详细解答下编程里的几种排序方法。

详解: http://ke..com/w?ct=17&lm=0&tn=WikiSearch&pn=0&rn=10&word=%C5%C5%D0%F2&submit=search归并排序 归并排序归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是... 5千字 2008-7-24 coolxiaojiB 快速排序 概述快速排序(Quick Sort)是一种有效的排序算法。虽然算法在最坏的情况下运行时间为O(n^2),但由于平均运行时间为O(nlogn),并且在内存使用、程序实现复杂性上表现优秀,尤其是对快速排序算法进行随机化的可能,使得快速排序在一般情况下是最实用... 8千字 2008-7-29 追月一族2 堆排序 斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了着名的堆排序算法( Heap Sort ) 定义n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质): (1... 10千字 2008-7-14 Watfourane 冒泡排序 冒泡排序:BubbleSort基本概念冒泡排序的基本概念是:依次比较相邻的两个数,将大数放在前面,小数放在后面。即首先比较第1个和第2个数,将大数放前,小数放后。然后比较第2个数和第3个数,将大数放前,小数放后,如此继续,直至比较最后两... 3千字 2008-4-12 凛冬将至_ 排序算法 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。分类在计算机科学所使用的排序算法通常被分类为: 计算的复杂度(最差、平均、和最好表现),依据串行(list)的大小(n)。一般而言,好的表现... 5千字 2008-3-18 12月26日魔羯座 希尔排序 希尔排序(Shell Sort)是插入排序的一种。因D.L.Shell于1959年提出而得名。希尔排序基本思想基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直... 2千字 2008-1-15 WXD11011 基数排序 “基数排序法”(radix sort)则是属于“分配式排序”(distribution sort),基数排序法又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,借以达到排序的作用,基数排序法是属于稳定性... 2千字 2007-12-23 gotolabel Shell排序 希尔排序是一种快速排序法,它出自D.L.Shell,因此而得名。Shell排序又称作缩小增量排序。基本思想:不断把待排序的对象分成若干个小组,对同一小组内的对象采用直接插入法排序,当完成了所有对象都分在一个组内的排序后,排序过程结束。... 1千字 2006-10-14 raoping2005 选择排序 基本思想 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。排序过程 【示例】: 初始关键字 [49 38 65 97 76 13 27 49]第一...

㈩ 计算机算法中的递归法与选择排序法是什么请细讲

递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。
能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。

递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n-2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中,当n为1和0的情况。
在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的结果,……,在得到了fib(n-1)和fib(n-2)的结果后,返回得到fib(n)的结果。
在编写递归函数时要注意,函数中的局部变量和参数知识局限于当前调用层,当递推进入“简单问题”层时,原来层次上的参数和局部变量便被隐蔽起来。在一系列“简单问题”层,它们各有自己的参数和局部变量。
由于递归引起一系列的函数调用,并且可能会有一系列的重复计算,递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时,通常按递推算法编写程序。例如上例计算斐波那契数列的第n项的函数fib(n)应采用递推算法,即从斐波那契数列的前两项出发,逐次由前两项计算出下一项,直至计算出要求的第n项。

选择排序法 是对 定位比较交换法 的一种改进。在讲选择排序法之前我们先来了解一下定位比较交换法。为了便于理解,设有10个数分别存在数组元素a[0]~a[9]中。定位比较交换法是由大到小依次定位a[0]~a[9]中恰当的值(和武林大会中的比武差不多),a[9]中放的自然是最小的数。如定位a[0],先假定a[0]中当前值是最大数,a[0]与后面的元素一一比较,如果a[4]更大,则将a[0]、a[4]交换,a[0]已更新再与后面的a[5]~a[9]比较,如果a[8]还要大,则将a[0]、a[8]交换,a[0]又是新数,再与a[9]比较。一轮比完以后,a[0]就是最大的数了,本次比武的武状元诞生了,接下来从a[1]开始,因为状元要休息了,再来一轮a[1]就是次大的数,也就是榜眼,然后从a[2]开始,比出探花,真成比武大会了,当必到a[8]以后,排序就完成了。
下面给大家一个例子:
mai()
{
int a[10];
int i,j,t;
for ( i = 0; i < 10; i ++ ) scanf("%d",&a[ i ]); /*输入10个数,比武报名,报名费用10000¥ ^_^*/
for ( i = 0; i < 9; i ++ )
for ( j = i + 1; j < 10; j ++)
if ( a[ i ] < a[ j ] ) { t = a[ i ]; a[ i ] = a[ j ]; a[ j ] = t; } /*打不过就要让出头把交椅,不过a[ i ]比较爱面子,不好意思见 a[ j ],让t帮忙*/
for( i = 0; i < 10; i ++) printf("%4d",a[ i ]); /*显示排序后的结果*/
}
好啦,罗嗦了半天总算把定位比较排序法讲完了,这个方法不错,容易理解,就是有点麻烦,一把椅子换来换去,哎~
所以就有了下面的选择排序法,开始的时候椅子谁也不给,放在一边让大家看着,找个人k记录比赛结果,然后发椅子。具体来讲呢就是,改进定位比较排序法,但是这个改进只是一部分,比较的次数没变,该怎么打还是怎么打,就是不用换椅子了。每次外循环先将定位元素的小标i值记录到K,认为a[k]是最大元素其实i=k还是a[ i ]最大,a[k]与后面的元素一一比较,该交换的也是也不换,就是把K的值改变一下就完了,最后在把a[k]与a[ i ]交换,这样a就是最大的元素了。然后进入下一轮的比较。选择排序法与定位比较排序法相比较,比的次数没变,交换的次数减少了。
下面也写个例子:
main()
{
int a[10];
int i,j,t,k;
for ( i = 0; i < 10; i ++ ) scanf("%d",&a[ i ]); /*输入10个数,比武报名,报名费用10000¥ ^_^*/
for ( i = 0; i < 9; i ++ )
{ k = i; /*裁判AND记者实时追踪报道比赛情况*/
for ( j = i + 1; j < 10; j ++)
if ( a[ k ] < a[ j ] ) k = j;
t = a[ i ]; a[ i ] = a[ k ]; a[ k ] = t; /* t 发放奖品*/
}
for( i = 0; i < 10; i ++) printf("%4d",a[ i ]); /*显示排序后的结果*/
}

阅读全文

与程序排序计算法相关的资料

热点内容
哈夫曼编码数据压缩 浏览:414
锁定服务器是什么意思 浏览:375
场景检测算法 浏览:607
解压手机软件触屏 浏览:338
方舟pv怎么转服务器 浏览:99
数据挖掘中误差值算法函数 浏览:118
php开发套件 浏览:190
服务器的spi板是什么 浏览:896
解压缩全能王中文密码是什么 浏览:80
javaftp服务器上传文件 浏览:103
算法设计中文版pdf 浏览:81
视频压缩形式怎么改 浏览:368
perl程序员 浏览:789
电子表格对比命令 浏览:610
php循环输出数组内容 浏览:750
电脑加密能不能强制关掉 浏览:616
趣味单人解压桌游 浏览:212
oppo手机谷歌服务器无法核实什么 浏览:320
软件怎么加密华为 浏览:222
扫地机怎么安装app 浏览:319