如果我們要排序的資料具有多個關鍵字域,那就可以採用基數排序的方法了。
基數排序的主要思想是:假如參加排序的元素最高具有d位,有的數沒有d位那麼多,則在其欠缺的高位補0,將元素先按最低位(設最右邊的位為最低位)的值進行排序,然後按次低位進行排序......最後進行最高位的排序。
基數排序如果想達到理想的目的,必須滿足兩個條件:
有的同學對「穩定」不太了解,排序演算法裡的「穩定」是這個意思:
假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,ri=rj,且ri在rj之前,而在排序後的序列中,ri仍在rj之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。
有些排序演算法是穩定的,有些排序演算法是不穩定的。但是不穩定的演算法在某種條件下可以調整為穩定的演算法,而穩定的演算法在某種條件下也可以改變為不穩定的演算法。
舉個例子,我要排序的陣列為。則用基數排序,演算法執行的過程如下圖所示:
圖中,每一行代表乙個數,每一列代表乙個位。首先對d1位進行排序,然後是d2,最後是d3。其實基數排序主要是一種思想,每乙個位的排序可以使用任意的排序,比如冒泡,插入等等,下面是具體的**:
#include#includeusing namespace std;
int maxbit(int data, int n) //輔助函式,求資料的最大位數
}return d;
}void radixsort(int data, int n) //基數排序
for(j = 1; j < 10; j++)
count[j] = count[j - 1] + count[j]; //將tmp中的位置依次分配給每個桶
for(j = n - 1; j >= 0; j--) //將所有桶中記錄依次收集到tmp中
for(j = 0; j < n; j++) //將臨時陣列的內容複製到data中
data[j] = tmp[j];
radix = radix * 10;
}deletetmp;
deletecount;
}int main()
; int length = sizeof(array)/sizeof(int);
cout<
for(int i=0;i
cout<
radixsort(array,length);
for(int i=0;i
return 0;
}
演算法 排序之基數排序
基數排序也是穩定的內排序。因為它的實現是基於內部使用了穩定的排序實現的所以基數排序整體是穩定的,而且時間複雜度為o n 舉個例子 現在我們將一些3 多 位數排序,如果你說直接判斷就好的話,那你就太天真了,因為那就又變成看o nlgn 或者o n 如何能降低時間複雜度變成o n 呢?那就要使用線性時間...
排序演算法之基數排序
首先從多排序碼排序開始介紹基數排序。以撲克牌排序為例。每張撲克牌有兩個 排序碼 花色和面值。其有序關係為 如果把所有撲克牌排成以下次序 2,a,2,a,2,a,2,a 這就是多排序碼排序。排序後形成的有序序列叫做字典有序序列。一般情況下,假定有乙個n個元素的序列 v 0,v1 vn 1 且每個元素v...
排序演算法之基數排序
基於排序是一種很特別的排序方法,它採用多關鍵字排序思想 即基於關鍵字各位的大小進行排序 借助 分配 和 收集 兩種操作對單邏輯關鍵字進行排序。基數排序又分為最高位優先 msd 和最低位優先 lsd 排序。基數排序 public void sort int array 建立乙個二維陣列 listque...