一堆n組卡片,每張卡片有三個域:卡片的組號,樣式以及面值。對其進行排序------數據結構與算法應用C++描述第三版

#pragma once
#ifndef __BINSORT_H
#define __BINSORT_H
#include <iostream>
#include <math.h>
#include <string>
#include <list>
using namespace std;

struct card{
    //
    int element[3];
    /*
    int deck;
    int suit;
    int face;
    */
    //上面的數組表示的是註釋中的三個成員
    card(int deck,int suit,int face){
        element[0] = deck;
        element[1] = suit;
        element[2] = face;
    }
};
void binSort(list<card> &theList,int range,int type){
    list<card> *p = new list<card>[range+1];
    for(auto it = theList.cbegin();it != theList.cend();it = theList.begin()){
        p[it->element[type]].push_back(*it);//這個是根據deck分成了不同的箱子
        theList.pop_front();//把頭結點拋出來,刪掉
    }
    //分完以後,我們還需要把同一個箱子中的不同成員繼續分
    for(int i = 0; i <= range;++i){
        for(auto it = p[i].begin(); it != p[i].end();it=p[i].begin()){//這個是第二次箱子排序了
            theList.push_back(*it);
            p[i].pop_front();
        }
    }
    delete []p;
}

#endif

.cpp

#include "binSort.h"


#define BUFFSIZE 100

int main()
{
    list<card> theCard;
    int n,deck,suit,face;
    cout<<"please input the number of group\n";
    cin>>n;
    cout<<"then input the card\n";
    for(int i = 0;i != n;++i){
        cin>>deck>>suit>>face;
        theCard.push_front(card(deck,suit,face));
    }
    cout<<"********************\n";
    for(auto it = theCard.begin(); it != theCard.end();it++){
        std::cout<<" "<<(*it).element[0]<<" "<<(*it).element[1]<<" "<<(*it).element[2];
        cout<<"\n";
    }
    for(int i = 0 ; i != 3; ++i)
        binSort(theCard,n,2-i);
    cout<<"********************\n";
    for(auto it = theCard.begin(); it != theCard.end();it++){
        std::cout<<" "<<(*it).element[0]<<" "<<(*it).element[1]<<" "<<(*it).element[2];
        cout<<"\n";
    }    
    return 0;
}

這個卡片的排序的思想其實就是多次桶排序(箱子排序)。可以這樣理解,這裏用deck,suit,face分別表示組號,樣式以及面值。然後其實就是根據這三個值對輸入的卡片進行排序。其實可以把這三個數表示爲一個整數的三個不同的部位。deck表示的是百位,suit表示的是十位,face表示的是個位數。所以我們可以按照這個順序進行三次桶排序。第一次根據個位數(deck)排序,第二次根據十位數(suit)排序,第三次根據百位數(deck)進行排序。
總結:其實無論卡片有多少個域(n個域),然後只需要進行n次桶排序就好了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章