排序算法之(6)——基數排序

【基數排序的思想】

首先使用基數r=10進行分解,將每個整數分成d位(d是待排元素中的最大位數),每位的取值範圍是0~9;因爲每一位有10種可能的情況,所以建立10個鏈表,即lists[0]~list[9],分別代表相應位爲0、1、2、3、4、5、6、7、8、9。然後執行下列步驟:
(1)第一趟:按照個位數,將元素放入相應鏈表中,若元素的個數爲0,則放入鏈表lists[0]中,若元素的個數爲1,則放入鏈表lists[1]中………………;然後按照鏈表的順序(lists[0]->list[1]->list[2]………….)將鏈表中的元素重新拿出來,此時全部元素已經按個位排好序。
(2)第二趟:將(1)得到的整數序列按照十位數,將元素放入相應鏈表中,若元素的十數爲0,則放入鏈表lists[0]中,若元素的十數爲1,則放入鏈表lists[1]中………………;然後按照鏈表的順序(lists[0]->list[1]->list[2]………….)將鏈表中的元素重新拿出來,此時全部元素也按十位排好序。
.
.
.
.
總共進行d趟排序。
經過d趟排序後,此時所有元素的每一位都排好序,即所有元素有序。

【代碼實現】

#include<iostream>
#include<list>
using namespace std;
int maxdigit(int data[],int n)
{
  int d=1;
  int p=10;
  for(int i=0;i<n;i++)
  {
    while(data[i]>=p)
    {
      p=p*10;
      d++;
    }
  }
  return d;
}
void radixsort(int data[],int n)
{
   int digits=maxdigit(data,n);
   list<int> lists[10];  //基數爲10,定義10個鏈表
   //---依次按個位、十位、百位....進行排序----
   for(int d=1,factor=1;d<=digits;factor*=10,d++)
   { 
       //-----元素進鏈表----
       for(int j=0;j<n;j++)  
       {
         lists[(data[j]/factor)%10].push_back(data[j]); //根據元素的相應位進鏈表
       }
       //---把鏈表裏的元素重新拿出來---
       int k=0;
       for(int j=0;j<10;j++)  
       {
         while(!lists[j].empty())
         {
          data[k]=lists[j].front();
          lists[j].pop_front(); 
          k++;
         }
       }
       //---查看中間結果----
       cout<<"第"<<d<<"趟結果:";
      for(int i=0;i<n;i++)
      {
        cout<<data[i]<<" ";
      }
      cout<<endl;
   }
}
int main()
{
    int data[10]={170, 201, 45, 2, 789, 4, 456, 56, 8, 47};
    radixsort(data,10);
    cout<<"排序結果:";
    for(int i=0;i<10;i++)
    {
     cout<<data[i]<<" ";
    }
    cout<<endl;
    system("pause");
    return 0;
}

【程序結果】

這裏寫圖片描述

發佈了64 篇原創文章 · 獲贊 29 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章