亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

詳解C++實現基數排序的方法

2020-02-24 14:30:56
字體:
來源:轉載
供稿:網友

排序算法是一個非常常見的問題,其實它的原理是將整數按數字分割成不同的數字,本文是武林技術頻道小編詳解C++實現基數排序的方法,感興趣的朋友可以進入下文了解一下!

基數排序(Radix sort)是一種非比較型整數排序算法,其原理是將整數按位數切割成不同的數字,然后按每個位數分別比較。由于整數也可以表達字符串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是只能使用于整數?;鶖蹬判虻陌l明可以追溯到1887年赫爾曼·何樂禮在打孔卡片制表機(Tabulation Machine)上的貢獻。
它是這樣實現的: 將所有待比較數值(正整數)統一為同樣的數位長度,數位較短的數前面補零. 然后, 從最低位開始, 依次進行一次排序.這樣從最低位排序一直到最高位排序完成以后, 數列就變成一個有序序列.
基數排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由鍵值的最右邊開始,而MSD則相反,由鍵值的最左邊開始。
(以上轉自維基百科)
下面是我自己的實現,不足之處,還望指正:

?

?

?


// RadixSort.cpp : 定義控制臺應用程序的入口點。
#include "stdafx.h"
#include <iostream>
using namespace std;
//定義隊列的節點
struct Node
{
?int data;
?Node* next;
};
//定義程序所需的特殊隊列
class Queue
{
public:
?Queue()
?{
??Node* p = new Node;
??p->data = NULL;
??p->next = NULL;
??front = p;
??rear = p;
?}
?~Queue()
?{
??Node* p = front;
??Node* q;
??while (p)
??{
???q = p;
???p = p->next;
???delete q;
??}
?}
?//在隊列的尾部添加一個元素,節點不存在,需要程序創建
?void push(int e)
?{
??Node* p = new Node;
??p->data = e;
??p->next = NULL;
??rear->next = p;
??rear = p;
?}
?//在隊列的尾部添加一個節點,節點原來就存在
?void push(Node* p)
?{
??p->next = NULL;
??rear->next = p;
??rear = p;
?}
?//數據元素中最大位數
?int lenData()
?{
??int temp(0);//數據元素的最大位數
??int n(0);?? //單個數據元素具有的位數
??int d;????? //用來存儲待比較的數據元素
??Node* p = front->next;
??while (p != NULL)
??{
???d = p->data;
???while (d > 0)
???{
????d /= 10;
????n++;
???}
???p = p->next;
???if (temp < n)
???{
????temp = n;
???}
???n = 0;
??}
??return temp;
?}
?//判斷隊列是否為空
?bool empty()
?{
??if (front == rear)
??{
???return true;
??}
??return false;
?}

?//清除隊列中的元素
?void clear()
?{
??front->next = NULL;
??rear = front;
?}

?//輸出隊列中的元素
?void print(Queue& que)
?{
??Node* p = que.front->next;
??while (p != NULL)
??{
???cout << p->data << " ";
???p = p->next;
??}
?}

?//基數排序
?void RadixSort(Queue& que)
?{
??//定義一個指針數組,數組中存放十個分別指向十個隊列的指針
??Queue* arr[10];
??for (int i = 0; i < 10; i++)
??{
???arr[i] = new Queue;
??}
??int d = 1;
??int m = que.lenData(); //取得待排序數據元素中的最大位數

??//將初始隊列中的元素分配到十個隊列中
??for(int i = 0; i < m; i++)
??{
???Node* p = que.front->next;
???Node* q;
???int k;? //余數為k,則存儲在arr[k]指向的隊列中
???while (p != NULL)
???{
????k = (p->data/d)%10;
????q = p->next;
????arr[k]->push(p);
????p = q;
???}
???que.clear(); //清空原始隊列

???//將十個隊列中的數據收集到原始隊列中
???for (int i = 0; i < 10; i++)
???{
????if (!arr[i]->empty())
????{
?????Node* p = arr[i]->front->next;
?????Node* q;
?????while (p != NULL)
?????{
??????q = p->next;
??????que.push(p);
??????p = q;
?????}
????}
???}
???for (int i = 0; i < 10; i++)//清空十個隊列
???{
????arr[i]->clear();
???}
???d *= 10;
??}
??print(que); //輸出隊列中排好序的元素
?}
private:
?Node* front;
?Node* rear;
};
int _tmain(int argc, _TCHAR* argv[])
{
?Queue oldque;
?int i;
?cout << "Please input the integer numbers you want to sort.Input ctrl+z to the end:" << endl;
?while (cin >> i)
?{
??oldque.push(i);
?}
?oldque.RadixSort(oldque);
??? cout << endl;
?return 0;
}


下面的代碼轉自維基百科,還沒仔細分析,先拿過來

?

?

?


#include <iostream>

using namespace std;

const int base=10;

struct wx
{
??????? int num;
??????? wx *next;
??????? wx()
??????? {
??????????????? next=NULL;
??????? }
};

wx *headn,*curn,*box[base],*curbox[base];

void basesort(int t)
{
??????? int i,k=1,r,bn;
??????? for(i=1;i<=t;i++)
??????? {
??????????????? k*=base;
??????? }
??????? r=k*base;
??????? for(i=0;i<base;i++)
??????? {
??????????????? curbox[i]=box[i];
??????? }
??????? for(curn=headn->next;curn!=NULL;curn=curn->next)
??????? {
??????????????? bn=(curn->num%r)/k;
??????????????? curbox[bn]->next=curn;
??????????????? curbox[bn]=curbox[bn]->next;
??????? }
??????? curn=headn;
??????? for(i=0;i<base;i++)
??????? {
??????????????? if(curbox[i]!=box[i])
??????????????? {
??????????????????????? curn->next=box[i]->next;
??????????????????????? curn=curbox[i];
??????????????? }
??????? }
??????? curn->next=NULL;
}

void printwx()
{
??????? for(curn=headn->next;curn!=NULL;curn=curn->next)
??????? {
??????????????? cout<<curn->num<<' ';
??????? }
??????? cout<<endl;
}

int main()
{
??????? int i,n,z=0,maxn=0;
??????? curn=headn=new wx;
??????? cin>>n;
??????? for(i=0;i<base;i++)
??????? {
??????????????? curbox[i]=box[i]=new wx;
??????? }
??????? for(i=1;i<=n;i++)
??????? {
??????????????? curn=curn->next=new wx;
??????????????? cin>>curn->num;
??????????????? maxn=max(maxn,curn->num);
??????? }
??????? while(maxn/base>0)
??????? {
??????????????? maxn/=base;
??????????????? z++;
??????? }
??????? for(i=0;i<=z;i++)
??????? {
??????????????? basesort(i);
??????? }
??????? printwx();
??????? return 0;
}

以上就是詳解C++實現基數排序的方法介紹,今天武林技術頻道小編就為大家分享到這里了,希望想學習的朋友通過上面的介紹有幫助!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
这里只有精品丝袜| 国产精品香蕉在线观看| 97超级碰在线看视频免费在线看| 精品久久久一区二区| 自拍偷拍免费精品| 国产最新精品视频| 亚洲视频在线视频| 91精品91久久久久久| 插插插亚洲综合网| 欧美激情亚洲视频| 精品国产依人香蕉在线精品| 欧美成人激情在线| 成人国产精品久久久| 国产偷亚洲偷欧美偷精品| 日韩精品欧美国产精品忘忧草| 久久精品在线播放| 欧美电影电视剧在线观看| 日韩亚洲欧美中文在线| 日韩在线观看电影| 韩国欧美亚洲国产| 色播久久人人爽人人爽人人片视av| 亚洲精品aⅴ中文字幕乱码| 91chinesevideo永久地址| 欧美极品少妇xxxxⅹ裸体艺术| 日韩av电影手机在线观看| 欧美高跟鞋交xxxxhd| 日韩精品一区二区视频| 国产精品久久久久久久av电影| 庆余年2免费日韩剧观看大牛| 亚洲a中文字幕| 精品magnet| 亚洲欧美中文字幕在线一区| 久久精品精品电影网| 欧美视频中文字幕在线| www日韩中文字幕在线看| 国产mv免费观看入口亚洲| 午夜精品福利视频| 日韩精品一二三四区| 国内精品久久久久影院优| 中文字幕精品www乱入免费视频| 91免费看片网站| 92看片淫黄大片欧美看国产片| 精品国偷自产在线| 国产成人精品电影久久久| 911国产网站尤物在线观看| 日韩一区二区久久久| 性色av一区二区三区在线观看| 一区二区三欧美| 精品成人乱色一区二区| 日韩免费观看视频| 日本亚洲欧美三级| 国产精品一久久香蕉国产线看观看| 清纯唯美亚洲综合| 久久精品国产一区二区三区| 福利视频第一区| 亚洲精品国精品久久99热一| 精品久久久久久久久久久久| 久久99亚洲精品| 成人网中文字幕| 日韩美女写真福利在线观看| 亚洲欧美日韩中文在线| 91在线精品视频| 国产精品美女午夜av| 国产视频999| 亚洲精品成人网| 成人免费大片黄在线播放| 中日韩美女免费视频网站在线观看| 亚洲免费电影在线观看| 激情亚洲一区二区三区四区| 97av在线视频| 亚洲成人精品视频在线观看| 92国产精品久久久久首页| 国产精品久久久91| 国产精品第2页| 日韩精品在线视频观看| 成人国产亚洲精品a区天堂华泰| 九九热精品视频在线播放| 国产区精品在线观看| 26uuu另类亚洲欧美日本老年| 欧美极品少妇全裸体| 亚洲精品久久久久中文字幕欢迎你| 亚洲色图第一页| 精品久久久国产精品999| 国产成人亚洲综合青青| 中文字幕精品av| 91中文字幕在线观看| 国产99久久精品一区二区永久免费| 欧美在线观看日本一区| 国产精品丝袜久久久久久不卡| 成人写真视频福利网| 国产精品免费视频久久久| 日日骚久久av| 亚洲一级免费视频| 亚洲女人天堂av| 日本亚洲精品在线观看| 欧美极品美女电影一区| 国产精品美女呻吟| 成人免费看吃奶视频网站| 国产成人亚洲精品| 日产精品99久久久久久| 国产精品入口免费视频一| 亚洲欧美在线免费| 久久av中文字幕| 亚洲网站在线看| 欧美中文字幕在线观看| 日韩精品亚洲精品| 精品亚洲男同gayvideo网站| 国产精品中文字幕在线观看| 日本一欧美一欧美一亚洲视频| 热99精品只有里视频精品| 国产精品69久久| 性日韩欧美在线视频| 91精品成人久久| 亚洲图中文字幕| 国内精品久久久久久中文字幕| 欧美老女人性视频| 国产精品男人的天堂| 午夜精品一区二区三区av| 欧美激情xxxx| 欧美一区深夜视频| 77777少妇光屁股久久一区| 中文字幕国产亚洲| 国产欧美精品一区二区三区-老狼| 91精品啪aⅴ在线观看国产| 狠狠躁夜夜躁人人爽超碰91| 欧美激情一区二区三区成人| 国产激情久久久久| 欧日韩不卡在线视频| 精品亚洲va在线va天堂资源站| 欧美在线视频网| 97色在线观看免费视频| 亚洲国产精品久久精品怡红院| 欧美资源在线观看| 亚洲男人的天堂在线播放| 51色欧美片视频在线观看| 日韩高清中文字幕| 理论片在线不卡免费观看| 91av在线播放视频| 国产精品日韩在线观看| 国产美女久久精品| 久久福利视频导航| www.日韩免费| 性色av一区二区三区免费| 九九热精品视频国产| 亚洲第一综合天堂另类专| 日韩免费在线免费观看| 97精品在线视频| 亚洲天堂第一页| 国产日韩精品在线| 日本人成精品视频在线| 色妞色视频一区二区三区四区| 欧美中文在线观看| 亚洲最大成人在线| 亚洲精品日韩丝袜精品| 热久久美女精品天天吊色| 日韩欧美一区二区三区久久| 国产亚洲精品久久久久久777| 欧美精品在线极品| 日韩国产精品视频| 精品日本美女福利在线观看| 亚洲电影在线看| 色先锋久久影院av| 曰本色欧美视频在线| 国产精品中文在线|