关于排序,这个是最,,,最基础的东西,但是,当我们学习排序的时候,我们似乎忘了一些问题,好像为了排序而排序,都忘记在干什么?那么有下面问题:
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记录每次循环停止时指针的位置,为什么?因为这个冒泡排序,它采用的是从前往后,然后从后往前,那些最大的,最小的,找到之后,就不参加比较,因此就有了上边的两个指针,左->右,然后,右->左,来来回回找,当发现前面>后面,则交换,同样是冒泡,是不是,和一般的不同呢?自己体验一下。
看看最后的结果: