双向冒泡排序

来源:互联网 发布:淘宝iphone6s防水标志 编辑:程序博客网 时间:2024/05/04 03:39

普通冒泡排序就不写了,这里写出了另外一种排序方式,其实和传统的冒泡排序是一样的,唯一不同的地方是双向的,解释如下: 假如说第一次把数组的最大值移动到了数组的a[length-1]的位置,传统的方式是指针再次回到a[0]进行移动,该方式是在a[length-2]开始,将最小的值移动到最左端a[0]的位置,然后在从a[1]的位置开始,这样双向反复,直到排序完毕。这种双向冒泡排序虽然最外层的循环次数减少了,但是内层排序增多了,不过总体的效率肯定有提高。下面是自己根据网上的思路写的代码,有不对的请大神指证。



using namespace std;#define N 10typedef struct{    int key;    //DataType other;}RecType;RecType R[N+1];void maopaoSort(RecType R[]){    int num=0;    int fnum=0;int wnum=0;    for(int i=0;i<N;i++){        bool flag = true ;        for(int j=0;j<N-i-1;j++){            if(R[j].key>R[j+1].key){                flag = false;                int temp = R[j].key;                R[j].key = R[j+1].key;                R[j+1].key = temp;              //  cout<<"正循环交换"<<num++<<endl;            }            cout<<"正循环"<<num++<<endl;        }//        for(int j=N-i-1;j>i;j--){//            if(R[j].key<R[j-1].key){//                flag = false;//                int temp = R[j].key;//                R[j].key = R[j-1].key;//                R[j-1].key = temp;//              //  cout<<"反循环交换"<<num++<<endl;//            }//            cout<<"反循环"<<fnum++<<endl;//        }        cout<<"外循环"<<wnum++<<endl;            if(flag) break;    }}int main(int argc, const char * argv[]) {        int a[10]={49,14,38,74,96,65,8,49,55,27};        for(int i=0;i<N;i++){            R[i]={a[i]};        };                maopaoSort(R);        for(int i=0;i<N;i++){            cout<<R[i].key<<endl;        };        return 0;}



1 0
原创粉丝点击