比较冒泡排序,选择排序和插入排序。利用随机生成的数据,登记并比较每种排序方法的比较次数和交换次数,验证每种排序方法效率的理论分析结果。经过大量统计计算,比较了各种排序方法的平均效率,并将统计结果与理论分析结论进行了比较。
以下是三种排序方法的用法和优点:
1.起泡法(起泡法)
算法要求10个整数按冒泡法升序排序。
算法分析:如果有n个数,就要进行n-1比较。在第一次比较中,需要将相邻元素成对比较n-1次,在j次比较中,需要将相邻元素成对比较n-j次。对比的顺序是从前到后。比较后,最大值下沉到最后一个元素位置,最大值按升序下沉,最小值按降序下沉。
算法源代码:
# include <stdio.h>main(){int a优点:稳定,已知比较次数;,i,j,t;printf("Please input 10 numbers: ");/*输入源数据*/for(i=0;i<10;i++)scanf("%d",&a[i]);/*排序*/for(j=0;j<9;j++) /*外循环控制排序趟数,n个数排n-1趟*/for(i=0;i<9-j;i++) /*内循环每趟比较的次数,第j趟比较n-j次*/if(a[i]>a[i+1]) /*相邻元素比较,逆序则交换*/{ t=a[i];a[i]=a[i+1];a[i+1]=t;}/*输出排序结果*/printf("The sorted numbers: ");for(i=0;i<10;i++)printf("%d ",a[i]);printf(" ");}算法特点:相邻元素成对比较,一个数在结果中的位置可以通过每次取最大值来确定。确定元素位置的顺序是从前到后,其他元素可以在相对位置上进行调整。您可以按升序或降序排序。
当一组无序数据a[1],a[2],a [n]已知时,应该按升序排列。首先,比较a[1]和a[2]的值。如果a[1]大于a[2],交换两者的值,否则保持不变。比较a[2]和a[3]的值。如果a[2]大于a[3],交换两者的值;否则,它保持不变。比较a[3]和a[4]等等,最后比较a[n-1]和a[n]的值。经过一轮这样的处理,a[n]的值一定是这组数据中最大的。如果我们把a[1]~a[n-1]同样对待另一轮,a[n-1]的值一定是a[1]~a[n-1]中最大的。用同样的方法对待a[1]~a[n-2]再来一轮,以此类推。A[1],a[2],...a [n]在n-1轮治疗后按升序排列。
[10]
缺点:速度慢,一次只能移动两个相邻的数据,移动数据的次数多。
算法分析:定义n-1个循环,将每个数n-j次比较,比较前一个数和下一个数的大小。然后交换订单。
2.选择方法
算法要求10个整数按选择方式降序排序。
算法分析:为每一遍选择一个最大值,交换第一个无序序列数,N个数选择n-1遍。在I遍中,我假设I是最大下标,然后将i+1的最大值与最后一个数进行比较,找出最大下标。如果最大下标不是初始值,用下标为I的元素交换最大元素。
算法源代码:
# include <stdio.h>main(){int a[10],i,j,k,t,n=10;printf("Please input 10 numbers:");for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<n-1;i++) /*外循环控制趟数,n个数选n-1趟*/{k=i; /*假设当前趟的第一个数为最值,记在k中 */for(j=i+1;j<n;j++) /*从下一个数到最后一个数之间找最值*/if(a[k]<a[j]) /*若其后有比最值更大的*/k=j; /*则将其下标记在k中*/if(k!=i) /*若k不为最初的i值,说明在其后找到比其更大的数*/{ t=a[k]; a[k]=a[i]; a[i]=t; }/*则交换最值和当前序列的第一个数*/}printf("The sorted numbers: ");for(i=0;i<10;i++)printf("%d ",a[i]);printf(" ");}算法特点:每一遍选择一个最大值来确定其在结果序列中的位置,从前到后确定元素的位置,而每一遍最多交换一次,其他元素的相对位置保持不变。您可以按降序或升序排序。
算法分析:定义外部n-1个周期,假设第一个是最大值,放在参数中,找到下一个数后的最大值,如果有比前一个大的值,就放在k中,然后分析k,如果k位点的初始I值。即假设I不是最大值,那么交换最大值和当前序列的第一个数字。
当一组无序数据a[1],a[2],a [n]已知时,应该按升序排列。首先,比较a[1]和a[2]的值。如果a[1]大于a[2],交换两者的值,否则保持不变。比较a[1]和a[3]的值。如果a[1]大于a[3],交换两者的值;否则,它保持不变。比较a[1]和a[4]等等,最后比较a[1]和a[n]的值。经过一轮这样的处理,a[1]的值必须是这组数据中最小的。以同样的方式将a[2]与a[3]~a[n]进行一轮比较后,a[2]的值必须是a[2]~a[n]中最小的。然后用同样的方法把a[3]和a[4]~a[n]对比一轮,以此类推。A[1],a[2],...a [n]在n-1轮治疗后按升序排列。
优点:稳定,比较次数与冒泡排序相同,数据移动次数少于冒泡排序;
缺点:比较慢。
3.插入方法
该算法要求用插入排序法对10个整数进行降序排序。
算法分析:将序列分为有序序列和无序列,将元素值从无序序列中取出,插入有序序列的适当位置。最初,有序序列中只有第一个数字,其余n-1个数字形成无序序列,因此n个数字需要插入n-1次。寻找有序序列中的插入位置,可以从有序序列的最后一个数字开始向前看,同时向后移动元素,才能找到插入点,为在空之间插入元素做准备。
算法源代码:
# include <stdio.h>main(){int a[10],i,j,t;printf("Please input 10 numbers: ");for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=1;i<10;i++)/*外循环控制趟数,n个数从第2个数开始到最后共进行n-1次插入*/{t=a[i]; /*将待插入数暂存于变量t中*/for( j=i-1 ; j>=0 && t>a[j] ; j-- ) /*在有序序列(下标0 ~ i-1)中寻找插入位置*/a[j+1]=a[j]; /*若未找到插入位置,则当前元素后移一个位置*/a[j+1]=t; /*找到插入位置,完成插入*/}printf("The sorted numbers: ");for(i=0;i<10;i++)printf("%d ",a[i]);printf(" ");}算法特点:每一遍从无序序列中取出第一个数字,插入有序序列的适当位置,最后一遍插入后才能确定元素的最终位置。您也可以使用循环来查找插入位置(从前到后或从后到前),然后在插入位置后逐个移动元素(按顺序),最后完成插入。该算法的特点是找到插入位置,同时移动元素。因为元素的移动必须是从后向前的,所以这两种操作可以结合在一起,提高算法的效率。您仍然可以按升序或降序排序。
给定一组升序数据a[1],a[2],...a [n],和一组无序数据b[1],b[2],...b [m],它们需要组合成一个升序。比较b[1]和a[1]的值,如果b[1]大于a[1]则跳过,比较b[1]和a[2]的值,如果b[1]仍然大于a[2]则继续跳过,直到b[1]小于一个数组中的某个数据a[x],然后B[2]~b[m]以同样的方式插入。(如果有无数个A群,b[1]可视为n=1的数组A)
优点:稳定快速;
缺点:比较次数不一定。比较次数越少,插入点后移动的数据越多,尤其是当数据总量巨大时。但是,这个问题可以通过使用链表来解决。
以上是边肖对“C语言三种排序方法”的使用和优点希望对你有点帮助!
1.《c语言的特点是什么 C语言中三种排序法的用处与优点是什么?》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《c语言的特点是什么 C语言中三种排序法的用处与优点是什么?》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/tiyu/1041635.html