#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次桶排序就好了。