常用排序算法之基数排序

来源:互联网 发布:淘宝达人链接 编辑:程序博客网 时间:2024/05/20 19:32
#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]的newbreak;}}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]的newbreak;}}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;elsebreak;}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;}

原创粉丝点击