冒泡排序法和选择排序法

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

冒泡排序法算法及算法实现算法首先比较第一个和第二个数据,将其中较小的数据放到第一个位置,较大的放到第二个位置;然后比较第二个和第三个数据,仍将较小放到后一个位置。依此类推,直到比较第n-1和第n个数据。这样,就将待排序序列中的最大的一个放到了第n个数据,这个过程称为第一趟排序。下面对前N-1个数据重复这个过程(不用考虑第n个数据,因为它已经是最大的了),又将次大的数据放到了第n-1个位置。一般地,第i趟冒泡排序是对第1个到第n-i+1个数据进行操作,选出原序列第i大的数据放到数组的第n-i+1位置。重复这个过程,直到i=n-1为止。4927137697653849数据87654321序号4938,交换位置算法演示序号12345678数据4938659776132749第一趟排序的步骤:序号12345678数据3849659776132749序号12345678数据3849659776132749序号12345678数据3849659776132749序号12345678数据3849657697132749序号12345678数据3849657613972749序号12345678数据3849657613279749序号12345678数据38496576132749974965,保持不变6597,保持不变9776,交换位置9713,交换位置9727,交换位置9749,交换位置9749271376654938数据87654321序号3849,保持不变第一趟排序后的数据和序号第二趟排序的步骤:序号12345678数据38496576132749974965,保持不变6576,保持不变7613,交换位置7627,交换位置7649,交换位置序号12345678数据3849657613274997序号12345678数据3849657613274997序号12345678数据3849657613274997序号12345678数据3849651376274997序号12345678数据3849651327764997序号12345678数据38496513274976977697,保持不变序号12345678数据3849651327497697观察原数据与第一、二趟排序后的数据序号12345678数据3849657613274997序号12345678数据3849651327497697序号12345678数据4938659776132749序号12345678数据3849132749657697第三趟排序序号12345678数据3813274949657697第四趟排序序号12345678数据3813274949657697第五趟排序序号12345678数据1327384949657697第六趟排序序号12345678数据1327384949657697第七趟排序序号12345678数据1327384949657697第八趟排序算法实现#includestdio.h#defineN8main(){inti,j,t,a[N];for(i=0;i=N-1;i++)scanf(%d,&a[i]);for(i=0;i=N-1;i++)/*输出排序后的结果*/printf(%d,,a[i]);printf(\n);}for(i=0;iN-1;i++)for(j=0;jN-1-i;j++)if(a[j]a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}选择排序法排序原理首先用第1个元素分别与其他元素比较,按排序要求找到最小数的位置,然后用该位置上的元素与第一个元素交换,这样第1个元素就确定好了。然后用第2个元素与其他未排序的元素进行比较,找到次小数,……,依此类推,直到全部元素排好序为止。排序过程从数组中找出最小数所在的那个位置,然后将该元素中的值与相应位置元素的值进行交换。执行过程:首先,p=0,用a[p]与a[1]比,如果a[p]a[1],则p值不变,否则p=1。接下来用a[p]与a[2]比,同样,如果a[p]a[2],则p值不变,否则p=2。依此类推,a[p]再与a[3]、a[4]、a[5]比。经过第一轮比较后,p指向最小数的位置,即a[p]值最小。然后判断p与i是否相等,如果p与i(i=1)不相等,则a[p]与a[0]交换,以上操作完成以后,就把a数组中最小值放入a[0]中。紧接着从a[1]到a[n-1]之间找出最小数的位置,并且把此位置上的数与a[1]交换,这一步操作与前面的相同,只是找出最小数的范围后移动一个位置。这一步操作完成之后,整个数组中第二个小的那个数将放在a[1]中。接着把a[2]到a[n-1]中的最小数找出来,放在a[2]中;依此类推,至a[n-1]中的最小数找出来,放在a[n-1]中,至此a[1]到a[n-1]中数将由小到大的顺序排好。a[0]3a[1]9a[2]4a[3]6a[4]7a[5]1a[0]3a[1]9a[2]4a[3]6a[4]7a[5]1a[0]3a[1]9a[2]4a[3]6a[4]7a[5]1a[0]3a[1]9a[2]4a[3]6a[4]7a[5]1a[0]3a[1]9a[2]4a[3]6a[4]7a[5]1第一轮p=0;a[p]与a[1]比p不变a[p]与a[2]比p不变a[p]与a[3]比p不变a[p]与a[4]比p不变a[p]与a[5]比p=5a[0]1a[1]9a[2]4a[3]6a[4]7a[5]3结果用p来表示指定范围内的最小数的下标,一轮结束后,p与i比较,不同时互换a[0]1a[1]9a[2]4a[3]6a[4]7a[5]3a[0]1a[1]9a[2]4a[3]6a[4]7a[5]3a[0]1a[1]9a[2]4a[3]6a[4]7a[5]3a[0]1a[1]9a[2]4a[3]6a[4]7a[5]3a[0]1a[1]3a[2]4a[3]6a[4]7a[5]9第二轮p=1;a[p]与a[2]比p=2a[p]与a[3]比p不变a[p]与a[4]比p不变a[p]与a[5]比p=5结果a[0]1a[1]3a[2]4a[3]6a[4]7a[5]9a[0]1a[1]3a[2]4a[3]6a[4]7a[5]9a[0]1a[1]3a[2]4a[3]6a[4]7a[5]9a[0]1a[1]3a[2]4a[3]6a[4]7a[5]9第三轮p=2;a[p]与a[3]比a[p]与a[4]比a[p]与a[5]比结果a[0]1a[1]3a[2]4a[3]6a[4]7a[5]9a[0]1a[1]3a[2]4a[3]6a[4]7a[5]9a[0]1a[1]3a[2]4a[3]6a[4]7a[5]9第四轮p=3;a[p]与a[4]比a[p]与a[5]比结果a[0]1a[1]3a[2]4a[3]6a[4]7a[5]9a[0]1a[1]3a[2]4a[3]6a[4]7a[5]9第五轮p=4;a[4]与a[5]比结果例:将六个数3,9,4,6,7,1按由小到大的顺序排列起来。main(){inti,j,x,a[6]={3,9,4,6,7,1};printf(“theoriginalnumbersare:\n”);for(i=0;i=5;i++)printf(“%d\t”,a[i]);for(i=0;i=4;i++){p=i;for(j=i+1;j=5;j++){if(a[p]a[j])p=j;}if(p!=i){x=a[p];a[p]=a[i];a[i]=x;}}printf(“\n”);printf(“thesortednumbersare:\n”);for(i=0;i=5;i++)printf(“%d\t”,a[i]);}选择法排序1、选择法排序程序段为(n个数据)for(i=0;i=n-2;i++){p=i;for(j=i+1;j=n-1;j++)if(a[p]a[j])p=j;if(p!=i){x=a[p];a[p]=a[i];a[i]=x;}}2、特点:总是在完成每轮比较之后最多进行一次交换操作,效率比顺序比较法高。

1 / 23
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功