排序-雙冒泡排序和冒泡排序(採用結構體)

冒泡排序

冒泡排序的基礎上變爲雙冒泡排,可減小遍歷次數序,從而實現優化
註釋代碼爲錯誤代碼,不用看,但反映了不一樣的思考方式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,以上就是雙冒泡排序算法

相關文章
相關標籤/搜索