双向冒泡排序

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



using namespace std;
#define N 10
typedef 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;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值