labview数组排序算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

18.2.2 冒泡排序

“冒泡”是什么意思?湖底有时会冒出一个气泡,气泡刚在湖底时,是很小的,在向上浮的过程中,才一点地慢慢变大。学过高中的物理的人,应该不难解释这一现象。冒泡排序的过程有点类似这个过程,每前进一步,值就大一点。

排序当然有两个方向,一种是从小排到大,一种是从大排到小。大多数教科书里都讲第一种,我们也如此。这样一来,冒泡排序法就改为“沉泡法”了,较大值一点点跑到数组中的末尾。

一般教科书里也会说,冒泡排序法是人们最熟悉,及最直观的排序法,我可不这样认为。或许老外在生活中用的是这种最笨的排序法?我猜想,大家在生活中99%使用后面要讲的“选择”排序法。

冒泡排序是这么一个过程(从小到大):

1、比较相邻的两个元素,如果后面的比前面小,就对调二者。反复比较,到最后两个元素。结果,最大值就跑到了最末位置。

2、反复第一步,直到所有较大值都跑到靠后的位置。

看一眼例子:

2,5,1,4,3

第一遍:

·比较第一对相邻元素:2,5,发现后面的5并不比2小,所以不做处理。序列保持不变:2,5,1,4,3

·继续比较后两对元素:5,1,发现后面的1比前面的5小,所以对调二者。现在,序列变为:2,1,5,4,3

·继续比较后两对元素:5,4……对调,于是:2,1,4,5,3

·继续比较后两对元素:5,3……对调,于是:2,1,4,3,5 <----- OK,现在最大值5跑到最尾处了。

大泡泡“5”浮出来了,但前面的2,1,4,3,还是没有排好,没事,再来一遍,不过,由于最后一个元素肯定是最大值了,所以我们这回只排到倒数第二个即可。

第二遍:

·比较第一对相邻元素:2,1,发现1比2小,所以对调:1,2,4,3,5

·继续比较后两对元素:2,4,不用处理,因为后面的数比较大。序列还是:1,2,4,3,5 ·继续 4,3,对调:1,2,3,4,5。

前面说,5 不用再参加比较了。现在的序列是1,2,3,4,5。接下来,我们再来一遍:

第三遍:

·比较第一对相邻元素:1,2:不用对调。

……等等……

有人说,现在已经是1,2,3,4,5了,完全是排好序了啊,何必再来进行呢?我们确实是看出前面1,2,3也井然有序了,但对于程序来说,它只能明确地知道自己已经排好了两个数:4,5,并不知道的1,2,3凑巧也排好了。所以它必须再排两次,直到确认把3和2都已推到合适的位置上。最后剩一个数是1,因为只有一个数,没得比,所以这才宣告排序结束。

那么到底要排几遍?看一看前面的“第一遍”、“第二遍”的过程你可发现,每进行一遍,可以明确地将一个当前的最大值推到末尾,所以如果排 Count 个数,则应排 Count 遍。当然,最后一遍是空走,因为仅剩一个元素,没得比较。

下面就动手写冒泡排序法的函数。写成函数是因为我们希望这个排序法可处理任意个元素的数组。

//冒泡排序(从小到大):

//num: 要接受排序的数组

//count : 该数组的元素个数

void bubble(int num[],int count)

{

int tmp;

//要排Count个数,则应排Count遍:

for (int i = 0; i < count; i++)

{

for(int j = 0; j < count - i - 1; j++)

{

//比较相邻的两个数:

if(num[j+1] < num[j])

{

//对调两个数,需要有"第三者"参以

tmp = num[j+1];

num[j+1] = num[j];

num[j] = tmp;

}

}

}

}

注意在内层循环中j的结束值是 count - i - 1。要理解这段代码,明白为什么结束在count - i -1?如果你忘了如何在CB进行代码调试,如果设置断点,如何单步运行,如何观察变量的

值,那么你需要“严重”复习前面有关“调试”的章节;如果你一直是高度着每一章的程序到现在,那么你可以继续下面的内容。

排序函数写出一个了,如何调试这个函数?在CB里新建一空白控制台程序,然后在主函数里,让我们写一些代码来调用这个函数,并且观察排序结果。

#include

……

void bubble(int num[],int count)

{

……

}

int main() //我实在有些懒得写main里两个参数,反正它们暂时对我们都没有用,

//反正CB会为你自动生成,所以从此刻起,我不写了,除非有必要。

{

int values[] = {2,5,1,4,3};

int count = sizeof(values[]) / sizeof(values[0]);

bubble(value,sizeof);

}

你要做的工作是单步跟踪上面的代码,看看整个流程是不是像我前面不厌其烦的写的“第一遍第二遍第三遍”所描述的。

完成上面的工作了吗?全部过程下来,只花20分钟应该算是速度快或者不认真的了(天知道你是哪一种?天知道你到底是不是没有完成就来骗我?)。现在让这个程序有点输出。我们加一个小小的函数:

//输出数组的元素值

//num :待输出的数组

//count:元素个数

void printArray(int num[],int count)

{

for(int i = 0; i < count; i++)

{

count << num[i] << ",";

}

cout << endl;

}

把这个函数加到main()函数头之前,然后我们用它来输出:

int main() //我实在有些懒得写main里两个参数,反正它们暂时对我们都没有用,

//反正CB会为你自动生成,所以从此刻起,我不写了,除非有必要。{

int values[] = {2,5,1,4,3};

int count = sizeof(values[]) / sizeof(values[0]);

cout << "排序之前:" << endl;

printArray(values,count);

//冒泡排序:

bubble(value,sizeof);

cout << "排序之后:" << endl;

printArray(values,count);

system("PAUSE");

相关文档
最新文档