现在的位置: 首页 > 综合 > 正文

基本排序之冒泡排序

2013年05月27日 ⁄ 综合 ⁄ 共 1194字 ⁄ 字号 评论关闭

关于排序,这个是最,,,最基础的东西,但是,当我们学习排序的时候,我们似乎忘了一些问题,好像为了排序而排序,都忘记在干什么?那么有下面问题:

1.为什么要排序?难道就是简简单单从大到小?

2.排了序,又能干什么?仅仅为了比大小?我们就都排个序?

3.你是对什么元素排序?它是怎么存储的??

和了,知道,这些,你就明白,这里我是对程序设计语言中的一维数组进行的排序。

冒泡排序,大家在学排序的时候,千万注意,虽然是一种简单的排序,它的思想不变,但是具体到实现,可是千千万万,非常不同,注意那些下标是如何发生变化的

咱们直接看代码:

#include<iostream>
using namespace std;
template <class T>
void bub(T p[],int n){
	int left,right,j,i;
	T d;
	left=0;right=n-1;
	while(left<right){
	j=right-1;right=0;
	for(i=left;i<=j;i++)
		if(p[i]>p[i+1])
	{
		d=p[i];p[i]=p[i+1];p[i+1]=d;right=i;
	}
	j=left+1;left=0;
	for(i=right;i>=j;i--)
		if(p[i-1]>p[i]){
		d=p[i-1];p[i-1]=p[i];p[i]=d;left=i;
		}
	}
	return;
}

这里再随机生成50个数据进行测试,当然,你也可以直接调用rand()或者,像我这样写一个随机函数

#include"bub.h"
#include<iomanip>
int main(){
	int i,j;
	double p[50],r=1.0;
	for(i=0;i<50;i++){
	r=2053.0*r+13489.0;
	j=r/65536.0;
	r=r-j*65536.0;
	p[i]=r/65536.0;
	}
	for(i=0;i<50;i++)
		p[i]=100.0+200.0*p[i];
	cout<<"sort the data:"<<endl;
	for(i=0;i<10;i++)
	{
	for(j=0;j<5;j++)
		cout<<setw(10)<<p[5*i+j];
	cout<<endl;
	}
	bub(p+10,30);
	cout<<"after the sort:"<<endl;
	for(i=0;i<10;i++)
	{
	for(j=0;j<5;j++)
		cout<<setw(10)<<p[5*i+j];
	cout<<endl;
	}
	return 0;
}

有关这个排序,我来说一下,left和right记录每次循环停止时指针的位置,为什么?因为这个冒泡排序,它采用的是从前往后,然后从后往前,那些最大的,最小的,找到之后,就不参加比较,因此就有了上边的两个指针,左->右,然后,右->左,来来回回找,当发现前面>后面,则交换,同样是冒泡,是不是,和一般的不同呢?自己体验一下。
看看最后的结果:

抱歉!评论已关闭.