#include"vld.h"//检测是否有内存泄漏
#include<iostream>
using namespace std;
struct MyInt
{
int val;
MyInt *next=NULL;
};
struct MyBase
{
MyInt *head = NULL;
MyInt *tail = NULL;
};
//每轮排好一位数后,将排好序的数放入另一个桶中,如果两个数排序位都为0,则都链接在base[0]后
MyBase baseA[10];//基数排序的桶A一共10个数(代表0-9)
MyBase baseB[10];//基数排序的桶B一共10个数(代表0-9)
int Change(MyInt *baseA, MyBase *baseB)//将桶A中的数,加入桶B中相应的位置
{
if (baseB->head == NULL)
{
baseB->head = baseA;
baseB->tail = baseA;
}
else
{
baseB->tail->next = baseA;
baseB->tail = baseB->tail->next;
}
return 0;
}
int Sort(MyInt *TempNum, MyBase *baseB, int TempInt)
{
switch (TempInt)
{
case 0:
Change(TempNum, &baseB[0]);
break;
case 1:
Change(TempNum, &baseB[1]);
break;
case 2:
Change(TempNum, &baseB[2]);
break;
case 3:
Change(TempNum, &baseB[3]);
break;
case 4:
Change(TempNum, &baseB[4]);
break;
case 5:
Change(TempNum, &baseB[5]);
break;
case 6:
Change(TempNum, &baseB[6]);
break;
case 7:
Change(TempNum, &baseB[7]);
break;
case 8:
Change(TempNum, &baseB[8]);
break;
case 9:
Change(TempNum, &baseB[9]);
break;
default:break;
}
return 0;
}
void SortRadix(MyInt *TempNum[3])
{
for (int i = 0; i < 10; i++)
{
int TempInt = 0;
TempNum[0] = new MyInt(); //每次进入循环就new一个MyInt类型的空间
cin>>TempNum[0]->val;//输入
TempNum[0]->next = NULL;
TempInt = TempNum[0]->val % 10;
Sort(TempNum[0], baseA, TempInt);//将输入的10个数按个位数的数值放入桶A中
}
for (int i = 0; i < 10; i++)
{
while (baseA[i].head != NULL)
{
TempNum[1] = new MyInt();
TempNum[1]->val = baseA[i].head->val;
TempNum[1]->next = NULL;
int TempInt = 0;
TempInt = baseA[i].head->val / 10;
TempInt = TempInt % 10;
Sort(TempNum[1], baseB, TempInt);
if (baseA[i].head != NULL&&baseA[i].head->next != NULL)
{
MyInt * temp = baseA[i].head;
baseA[i].head = baseA[i].head->next;
delete temp;//对应于TempNum[0]的new
}
else
{
delete baseA[i].head;//对应于TempNum[0]的new
break;
}
}
baseA[i].head = NULL;
baseA[i].tail = NULL;
}
for (int i = 0; i < 10; i++)
{
while (baseB[i].head != NULL)
{
TempNum[2] = new MyInt();
TempNum[2]->val = baseB[i].head->val;
TempNum[2]->next = NULL;
int TempInt = 0;
TempInt = (baseB[i].head->val / 10)/10;
TempInt = TempInt % 10;
Sort(TempNum[2], baseA, TempInt);
if (baseB[i].head != NULL&&baseB[i].head->next != NULL)
{
MyInt * temp = baseB[i].head;
baseB[i].head = baseB[i].head->next;
delete temp;//对应于TempNum[1]的new
}
else
{
delete baseB[i].head;//对应于TempNum[1]的new
break;
}
}
baseB[i].head = NULL;
baseB[i].tail = NULL;
}
}
int main()
{
cout << "请依次输入需要排序的10个数:" << endl;
MyInt *TempNum[3];//三位数
SortRadix(TempNum);
cout << "经过基数排序后的顺序为:" << endl;
for (int i = 0; i < 10; i++)
{
MyInt * temp = baseA[i].head;
while (baseA[i].head!=NULL)
{
cout << baseA[i].head->val << endl;
if (baseA[i].head->next != NULL)
baseA[i].head = baseA[i].head->next;
else
break;
}
baseA[i].head = temp;//输出完后再将指针指会原来的位置
}
//防止内存泄漏
for (int i = 0; i < 10; i++)//对应于TempNum[2]的new
{
while (baseA[i].head != NULL&&baseA[i].head->next != NULL)
{
MyInt * temp = baseA[i].head;
baseA[i].head = baseA[i].head->next;
delete temp;
}
delete baseA[i].head;
}
return 0;
}
常用排序算法之基数排序
最新推荐文章于 2022-05-03 16:00:55 发布