2009年3月30日

                

 

 

冒泡排序法

2007年08月01日 星期三 17:36

冒泡排序法又名起泡法。

冒泡排序法原理详解(一):

起泡法是从一端开始比较的,第一次循环就是把最小数上升到第一位置,第二次循环就是把第二最小数上升到第二位置。如此循环实现数据的排序。那么我们是否可以找到最小数的同时找到最大数呢?当然可以。方法是在一端起泡时同时在另一端也进行起泡。即反向起泡。下面的程序段实现的是双向起泡:

void Bubble2Sort(int* pData,int Count)

{

int iTemp;

int left = 1;

int right =Count -1;

int t;

do

{

//正向的部分

for(int i=right;i>=left;i--)

{

if(pData {

iTemp = pData;

pData = pData[i-1];

pData[i-1] = iTemp;

t = i;

}

}

left = t+1;

//反向的部分

for(i=left;i {

if(pData {

iTemp = pData;

pData = pData[i-1];

pData[i-1] = iTemp;

t = i;

}

}

right = t-1;

}while(left<=right);

}

分析上面的程序段我们可以发现正向起泡时第一次循环找出了最小数,反向起泡第一次循环找到最大数。很显然在一次循环中即可以找到一个最小的数还可以找到一个最大的数,所以用双向冒泡排序的交换的次数减少了,从而达到了优化起泡法的作用。

冒泡排序法原理详解(二):

首先申明,这不是教程,我只是将冒泡排序原理详细解释,希望对大家有用~~~

冒泡法排序是一个比较简单的排序方法。在待排序的数列基本有序的情况下排序速度较快。若要排序的数有n个,则需要n-1轮排序,第j轮排序中,从第一个数开始,相邻两数比较,若不符合所要求的顺序,则交换两者的位置;直到第n+1-j个数为止,第一个数与第二个数比较,第二个数与第三个数比较,......,第n-j个与第n+1-j个比较,共比较n-1次。此时第n+1-j个位置上的数已经按要求排好,所以不参加以后的比较和交换操作。例如:第一轮排序:第一个数与第二个数进行比较,若不符合要求的顺序,则交换两者的位置,否则继续进行二个数与第三个数比较......。直到完成第n-1个数与第n个数的比较。此时第n个位置上的数已经按要求排好,它不参与以后的比较和交换操作;第二轮排序:第一个数与第二个数进行比较,......直到完成第n-2个数与第n-1个数的比较;......第n-1轮排序:第一个数与第二个数进行比较,若符合所要求的顺序,则结束冒泡法排序;若不符合要求的顺序,则交换两者的位置,然后结束冒泡法排序。

共n-1轮排序处理,第j轮进行n-j次比较和至多n-j次交换。

从以上排序过程可以看出,较大的数像气泡一样向上冒,而较小的数往下沉,故称冒泡法。

我给出了一个例子,大家自己看一下吧

AS为:function array_1(array) {

for (var n = 0; n<array.length; n++) {

for (var j = 0; j<array.length-n; j++) {

if (array[j]<array[j+1]) {

temp = array[j];

array[j] = array[j+1];

array[j+1] = temp;

}

}

for (var k = 0; k<array.length; k++) {

trace(array[k]);

}

trace(" ");

}

}

my_array = new Array(0, 2, 3, 9);

array_1(my_array);

看了原理,AS应该没问题了,当然大家可以通过改变数组中元素以及个数来验证程序。

希望对大家有帮助

 

 

 

 

// C001.cpp : 定义控制台应用程序的入口点。
//

#include <iostream>
#include <time.h>
using namespace std;

void sort(int b[],int count);

//int _tmain(int argc, _TCHAR* argv[])
int main()
{
cout<<"冒泡排序法例子"<<endl;
int intA[10];
//最好先调用srand函数,如srand( (unsigned)time( NULL ) ),
//这样可以每次产生的随机数序列不同
srand( (unsigned)time( NULL ) );
for(int i=0;i<10;i++)
{
   cout<<"intA["<< i << "] = "<<intA[i]<<endl;
   //intA[i] = (int)(rand() / RAND_MAX);
   intA[i] = (int)rand();
}

cout<<"未排序后的随机数---------------------------------------"<<endl;
for(int i=0;i<10;i++)
{
   cout<<"intA["<< i << "] = "<<intA[i]<<" , ";
}
cout<<endl;

//排序
sort(intA, 10);

cout<<"排序后的随机数 ---------------------------------------"<<endl;
for(int i=0;i<10;i++)
{
   cout<<"intA["<< i << "] = "<<intA[i]<<" , ";
}
cout<<endl;


system("PAUSE");

return 0;
}

//排序
void sort(int b[],int count)
{
    int t,tempt;
    for(int i=0;i<count;i++)
    {
   t=count-i-1;
   for(int j=0;j<t;j++)
   {
    //依此类推 最大的放在最后面
    if(b[j] > b[j+1])
    {
     tempt = b[j];
     b[j] = b[j+1];
     b[j+1] = tempt;
    }
   }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值