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