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

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

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

2020-01-26 16:03:37
字體:
來源:轉載
供稿:網友
基數排序(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;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品日本精品| 亚洲人成电影在线播放| 永久免费毛片在线播放不卡| 国产在线观看一区二区三区| 黄色成人在线免费| 日韩av三级在线观看| 欧美一级视频一区二区| 久久久久久久电影一区| 久久久久久美女| 中文字幕在线精品| 97成人精品视频在线观看| 成人免费看吃奶视频网站| 色婷婷亚洲mv天堂mv在影片| 亚洲在线观看视频网站| 91九色精品视频| 成人国产精品一区二区| 久久久久久91香蕉国产| 国产精品亚洲自拍| 欧美一级成年大片在线观看| 欧美日韩国产精品| 精品无人区太爽高潮在线播放| 91精品国产高清久久久久久91| 九九九热精品免费视频观看网站| 久久精品国产精品亚洲| 亚洲精品日韩激情在线电影| 国产精品美女www爽爽爽视频| 最近2019中文字幕大全第二页| 欧美一区二区影院| …久久精品99久久香蕉国产| 亚洲免费精彩视频| 亚洲第一免费播放区| 久久久国产成人精品| 国产精品久久一区主播| 欧美亚洲激情在线| 91国产精品91| 亚洲国产欧美一区二区三区久久| 国产精品久久久久久久久久小说| 久久久女人电视剧免费播放下载| 一本大道亚洲视频| 日韩免费在线播放| 日本最新高清不卡中文字幕| 国产成人+综合亚洲+天堂| 这里只有精品视频| 久久精品色欧美aⅴ一区二区| 插插插亚洲综合网| 91香蕉国产在线观看| 欧美午夜片在线免费观看| 欧美精品免费看| 欧美日韩国产一区在线| 高清日韩电视剧大全免费播放在线观看| 蜜臀久久99精品久久久无需会员| 久久亚洲成人精品| 成人欧美一区二区三区在线| 欧美有码在线观看| 亚洲免费人成在线视频观看| 久久亚洲国产精品成人av秋霞| 黄色成人在线播放| 亚洲欧美激情另类校园| 欧美精品videosex极品1| 成人午夜在线影院| 人九九综合九九宗合| 蜜臀久久99精品久久久久久宅男| 欧美日韩国产丝袜另类| 欧美高清视频在线播放| 日韩精品电影网| 久久综合久中文字幕青草| 欧日韩在线观看| 国产在线不卡精品| 国产脚交av在线一区二区| 在线观看国产精品91| 成人黄色在线观看| 亚洲日韩欧美视频| 国产午夜精品视频免费不卡69堂| 岛国av一区二区| 色综合久久悠悠| 欧美激情一区二区三区在线视频观看| 久久久噜久噜久久综合| 国产日韩精品综合网站| 精品国产鲁一鲁一区二区张丽| 欧美成人激情图片网| 亚洲成色777777女色窝| 91免费的视频在线播放| 亚洲日本成人网| 日韩美女在线播放| 亚洲色图25p| 91国自产精品中文字幕亚洲| 久久久久99精品久久久久| 亚洲专区在线视频| 欧美日韩在线视频一区| 久久精品电影网| 亚洲国产精品字幕| 亚洲欧美日韩爽爽影院| 国产裸体写真av一区二区| 日韩av在线资源| 黑人与娇小精品av专区| 日韩a**站在线观看| 国产精品扒开腿爽爽爽视频| 国产日韩综合一区二区性色av| 欧美日韩国产色视频| 亚洲japanese制服美女| 国产精品偷伦一区二区| 欧美一区二区三区四区在线| 免费av一区二区| 日韩有码片在线观看| 亚洲欧美日韩精品| 久久91精品国产| 在线观看欧美成人| 欧美精品性视频| 国产a级全部精品| 精品露脸国产偷人在视频| 成人免费视频在线观看超级碰| 久久国产精彩视频| 国产欧美久久久久久| 国产欧美日韩中文字幕在线| 欧美与黑人午夜性猛交久久久| 国产+成+人+亚洲欧洲| 超碰97人人做人人爱少妇| 亚洲国产另类久久精品| 午夜精品福利在线观看| 国语自产精品视频在免费| 色婷婷av一区二区三区在线观看| 国产精品成人一区二区| 激情成人在线视频| 国产成人精品亚洲精品| 精品亚洲国产成av人片传媒| 亚洲深夜福利在线| 日本一区二三区好的精华液| 中文精品99久久国产香蕉| 欧美日韩国产精品一区| 国产精品视频专区| 日韩在线资源网| 国产欧美日韩丝袜精品一区| 欧美黄色小视频| 亚洲欧美一区二区三区久久| 中文在线资源观看视频网站免费不卡| 亚洲电影免费观看高清完整版在线| 欧美一级大片在线免费观看| 国产精品27p| 欧美日韩精品国产| 亚州成人av在线| 亚洲色图25p| 91国产精品91| 国产区亚洲区欧美区| 亚洲视频综合网| 亚洲国产精品免费| 日韩欧美在线观看| 国产视频亚洲精品| 久久久精品视频成人| 91国产视频在线| 欧美日韩国产一区在线| 狠狠躁夜夜躁人人爽超碰91| 97欧美精品一区二区三区| 亚洲精品国产精品国自产观看浪潮| 日韩av最新在线| 欧美日韩午夜视频在线观看| 欧美疯狂做受xxxx高潮| 精品亚洲夜色av98在线观看| 揄拍成人国产精品视频| 国产精品视频公开费视频| 成人性教育视频在线观看| 国产日韩视频在线观看| 国内揄拍国内精品少妇国语| 欧美国产视频一区二区| 91香蕉国产在线观看|