注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Oracle专业打杂

定会重回巅峰……

 
 
 

日志

 
 

C 语言中三种常见排序算法分析  

2011-05-26 00:29:35|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 三种常见排序

一、冒泡法(起泡法) 冒泡法(起泡法)算法要求

算法要求:用起泡法对 10 个整数按升序排序。 要求 算法分析:如果有 n 个数,则要进行 n-1 趟比较。在第 1 趟比较中要进行 n-1 次相邻元素的两两比较,在第 算法分析 j 趟比较中要进行 n-j 次两两比较。比较的顺序从前往后,经过一趟比较后,将最值沉底(换到最后一个元素位 置) ,最大值沉底为升序,最小值沉底为降序。

算法源代码: 算法源代码

# 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(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("\n");

}

算法特点:相邻元素两两比较,每趟将最值沉底即可确定一个数在结果的位置,确定元素位置的顺序是从后 算法特点 往前,其余元素可能作相对位置的调整。可以进行升序或降序排序。

 二、选择法算法要求:用选择法对 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]); /*外循环控制趟数,n 个数选 n-1 趟*/

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

{

k=i; /*假设当前趟的第一个数为最值,记在 k 中 */

for(j=i+1;j<n;j++) /*从下一个数到最后一个数之间找最值*/

if(a[k]<a[j]) /*若其后有比最值更大的*/

 k=j; /*则将其下标记在 k 中*/ /*若 k 不为最初的 i 值,说明在其后找到比其更大的数*/

 if(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"); }

算法特点:每趟是选出一个最值确定其在结果序列中的位置,确定元素的位置是从前往后,而每趟最多进行一 算法特点 次交换,其余元素的相对位置不变。可进行降序排序或升序排序。

三、插入法算法要求:用插入排序法对 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("\n"); }

算法特点: 元素的最终位置在最后一趟插入后 算法特点 每趟从无序序列中取出第一个数插入到有序序列的合适位置, 才能确定位置。也可是先用循环查找插入位置(可从前往后或从后往前) ,再将插入位置之后的元素(有序列中) 逐个后移一个位置,最后完成插入。该算法的特点是在寻找插入位置的同时完成元素的移动。因为元素的移动必 须从后往前,则可将两个操作结合在一起完成,提高算法效率。仍可进行升序或降序排序。

  评论这张
 
阅读(75)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017