冒泡排序的基礎上變爲雙冒泡排,可減小遍歷次數序,從而實現優化
註釋代碼爲錯誤代碼,不用看,但反映了不一樣的思考方式ios
//算法8.4 冒泡排序 #include <iostream> using namespace std; #define MAXSIZE 20 //順序表的最大長度 typedef struct { int key; char *otherinfo; }ElemType; //順序表的存儲結構 typedef struct { ElemType *r; //存儲空間的基地址 int length; //順序表長度 }SqList; //順序表類型 void BubbleSort(SqList &L) { //對順序表L作冒泡排序 int m,j,flag; ElemType t; m=L.length-1; flag=1; //flag用來標記某一趟排序是否發生交換 while((m>0)&&(flag==1)) { flag=0; //flag置爲0,若是本趟排序沒有發生交換,則不會執行下一趟排序 for(j=0;j<m;j++) if(L.r[j].key>L.r[j+1].key) { flag=1; //flag置爲1,表示本趟排序發生了交換 t=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=t; //交換先後兩個記錄 } //if --m; } //while } //BubbleSort // void dubBubbleSort(SqList &L){ // // } // void dubBubbleSort(SqList &L) // { // int left, right, l, r, j, i = 0; // ElemType t; // left =1; // right = L.length -1; // //必需要給l和r賦值,不然若數組一開始就有序,則right=r中的r未賦值,即報錯 // while(left < right){ // l = left + 1; // r = right -1; // //第一次循環將最大的值放到末尾 // for(j = left; j <= right; j++) // { // if(L.r[j].key > L.r[j + 1].key) // { // t=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=t; // // r = j; // } // } // right = r; // //第二次循環將最小的值放到了開頭 // for(j = right; j >= left; j--) // { // if(L.r[j].key < L.r[j - 1].key) // { // t=L.r[j];L.r[j]=L.r[j-1];L.r[j-1]=t; // // l = j; // } // } // left = l; // // printf("第%d次排序結果:", i + 1); // // i++; // // for(j = 0; j < L.length; j++){ // // printf("%d\t", L.r[j].key); // // } // } // } void dubBubbleSort(SqList &L){ cout<<"排序過程:"<<endl; int m = L.length-1; ElemType t; int n=0; while(m>n){ for (int i = 0; i < m; i++) { if (L.r[i].key > L.r[i+1].key) { t=L.r[i];L.r[i]=L.r[i+1];L.r[i+1]=t; } } m--; for (int i = m; i > n; i--) { if (L.r[i].key < L.r[i-1].key) { t=L.r[i];L.r[i]=L.r[i-1];L.r[i-1]=t; } } n++; for( int j=0;j < L.length ; j++){ cout<<L.r[j].key; } cout<<endl; } } // int i, j, flag; // int n=L.length-1; // flag = 1; // i = 1; // while (flag != 0) // { // flag = 0; // for (j = i; j < n-i; j++) // { // if (L.r[j].key > L.r[j + 1].key) // { // flag = 1; // L.r[0].key = L.r[j].key; // L.r[j].key = L.r[j + 1].key; // L.r[j + 1].key = L.r[0].key; // } // } // // i=1; // for (j = n - i; j > i; j--) // { // if (L.r[j].key < L.r[j - 1].key) // { // flag = 1; // L.r[0].key= L.r[j].key; // L.r[j].key = L.r[j - 1].key; // L.r[j - 1].key = L.r[0].key; // } // } // i++; // } void Create_Sq(SqList &L) { int i,n; cout<<"請輸入數據個數,不超過"<<MAXSIZE<<"個。"<<endl; cin>>n; //輸入個數 cout<<"請輸入待排序的數據:\n"; while(n>MAXSIZE) { cout<<"個數超過上限,不能超過"<<MAXSIZE<<",請從新輸入"<<endl; cin>>n; } for(i=0;i<n;i++) { cin>>L.r[i].key; L.length++; } } void show(SqList L) { int i; for(i=0;i<L.length;i++) cout<<L.r[i].key<<" "; cout<<endl; } int main() { SqList L; L.r=new ElemType[MAXSIZE+1]; L.length=0; Create_Sq(L); BubbleSort(L); cout<<"冒泡排序後的結果爲:"<<endl; show(L); SqList L2; L2.length=0; L2.r=new ElemType[MAXSIZE+1]; Create_Sq(L2); dubBubbleSort(L2); cout<<"雙冒泡排序後的結果爲:"<<endl; show(L2); }
ok,以上就是雙冒泡排序算法