普通冒泡排序就不写了,这里写出了另外一种排序方式,其实和传统的冒泡排序是一样的,唯一不同的地方是双向的,解释如下: 假如说第一次把数组的最大值移动到了数组的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;
}