// sort.cpp : Defines the entry point for the console application.
//
/*
基数排序: 对其每一位数进行箱排序digits*(len+range)
*/
#include "stdafx.h"
#include <iostream>
#include<list>
#include<math.h>
#include<string>
using namespace std;
class Node
{
public:
void binsort(list<Node> &initialstatus, int range,int digit );
void RadixSort( list<Node> & initialstatus, int range,int digits);
void inptstatus(list<Node>&initialstatus,int &digits );
void output(list<Node> initialstatus);
private:
int score;
string name;
};
void Node::output(list<Node> initialstatus)
{
list<Node>::iterator pos;
for(pos=initialstatus.begin();pos!=initialstatus.end();++pos)
cout<<(*pos).name<<" "<<(*pos).score<<endl;
}
void Node::inptstatus(list<Node>&initialstatus,int &digits)
{
Node x;
cout<<"请输入有几位数:"<<endl;
cin>>digits;
for(int i=0;i<3;i++)
{
cin>>x.name>>x.score;
initialstatus.push_back(x);
}
}
void Node::RadixSort(list<Node> &initialstatus, int range,int digits)//基数排序函数
{
//list<Node>::iterator pos;
for(int i=1;i<=digits;++i)
{
binsort(initialstatus,range,i);
}
}
void Node::binsort(list<Node> & initialstatus,int range,int digit)//箱排序函数
{
int len=initialstatus.size();
Node x;
list<Node> *bin;
bin=new list<Node>[range];
int j;
for(int i=1;i<=len;++i)
{
x=initialstatus.front();
initialstatus.pop_front();
j=(x.score)%(int)pow((double)range,digit)/(int)pow((double)range,(digit-1));//取每位数
bin[j].push_front(x);
}
for(int m=range-1;m>=0;--m)
{
while(!bin[m].empty())
{
x=bin[m].front();
bin[m].pop_front();
initialstatus.push_front(x);
}
}
//for(int i=0;i<range;i++)
delete [] bin;
}
void main()
{
list<Node> initialstatus;
int range=10;
int digits=1;
Node x;
x.inptstatus(initialstatus,digits);
x.RadixSort(initialstatus,range,digits);
x.output(initialstatus);
}
基数排序
最新推荐文章于 2023-04-13 11:24:26 发布