1. 程式人生 > >基數排序(C++版)

基數排序(C++版)

假設原來有一串數值如下所示:
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中:
0
1 81
2 22
3 73 93 43
4 14
5 55 65
6
7
8 28
9 39


第二步:
接下來將這些桶子中的數值重新串接起來,成為以下的數列:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接著再進行一次分配,這次是根據十位數來分配:
0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93


第三步:
接下來將這些桶子中的數值重新串接起來,成為以下的數列:
14, 22, 28, 39, 43, 55, 65, 73, 81, 93

這時候整個數列已經排序完畢;如果排序的物件有三位數以上,則持續進行以上的動作直至最高位數為止。

/**
* name:基數排序
* time:15/8/16 15:00
* environment: ubuntu 14.04, sublime text 3
*/
#include <iostream>
using namespace std;

/*
* 列印陣列
*/
void printArray(int array[],int length)
{
	for (int i = 0; i < length; ++i)
	{
		cout << array[i] << " ";
	}
	cout << endl;
}
/*
*求資料的最大位數,決定排序次數
*/
int maxbit(int data[], int n) 
{
    int d = 1; //儲存最大的位數
    int p = 10;
    for(int i = 0; i < n; ++i)
    {
        while(data[i] >= p)
        {
            p *= 10;
            ++d;
        }
    }
    return d;
}
void radixsort(int data[], int n) //基數排序
{
    int d = maxbit(data, n);
    int tmp[n];
    int count[10]; //計數器
    int i, j, k;
    int radix = 1;
    for(i = 1; i <= d; i++) //進行d次排序
    {
        for(j = 0; j < 10; j++)
            count[j] = 0; //每次分配前清空計數器
        for(j = 0; j < n; j++)
        {
            k = (data[j] / radix) % 10; //統計每個桶中的記錄數
            count[k]++;
        }
        for(j = 1; j < 10; j++)
            count[j] = count[j - 1] + count[j]; //將tmp中的位置依次分配給每個桶
        for(j = n - 1; j >= 0; j--) //將所有桶中記錄依次收集到tmp中
        {
            k = (data[j] / radix) % 10;
            tmp[count[k] - 1] = data[j];
            count[k]--;
        }
        for(j = 0; j < n; j++) //將臨時陣列的內容複製到data中
            data[j] = tmp[j];
        radix = radix * 10;
    }
}

int main()
{
	int array[10] = {73,22,93,43,55,14,28,65,39,81};
	radixsort(array,10);
	printArray(array,10);
	return 0;
}

//結果
//14 22 28 39 43 55 65 73 81 93  


相關推薦

基數排序C++

假設原來有一串數值如下所示: 73, 22, 93, 43, 55, 14, 28, 65, 39, 81 首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中: 0 1 81 2 22 3 73 93 43 4 14 5 55 65 6 7 8 28 9 39

分治演算法排序C++

分治排序: 把一個數組分成兩個陣列,然後在把這兩個陣列再各自分成兩個陣列,直到陣列有兩個數,然後比較這兩個數,並且合併,排序。 就是上面這個樣子 的。。 不說了上程式碼(c++版): /** * name:分治演算法 * time:15/8/9 14:25 * envi

資訊學奧賽一本通C++第二部分 基礎演算法 第二章 資料排序

第二章 資料排序 T1310 : 車廂重組 時間限制: 1000 ms 記憶體限制: 65536 KB 【題目描述】   在一箇舊式的火車站旁邊有一座橋,其橋面可以繞河中心的橋墩水平旋轉。一個車站的職工發現橋的長度最多能容納兩節車廂,如果將橋旋轉180180

常用的排序演算法詳解C#

只要是搞程式設計的演算法、資料結構、作業系統、計算機組成原理這些東西都會有用到,就像醫生給人治病一樣,只有瞭解了人的內部機理、運作機制,才能很好的做到對症下藥,藥到病除。而上面所說的那些計算機理論課就好像人的內部機理一樣,我們往往都把這些東西給忽略了,而把更多的精力放在具體的程式語言實現上,當然我也是這樣,

高速排序Java

content 輸入 println pop package ati 遞歸 子列 大於 package com.love.test; import java.util.Scanner; /** * @author huowolf *高速排序實現 *快排是十

自動發牌C#

using ide bsp eric read over void log 成員 利用數組實現發牌過程 一副牌去掉大小王,還剩52張。一共東、南、西、北四家,每家隨機發13張牌。 提示: 東、南、西、北四家用一維數組表示 每家的牌采用一維數組表示(13張)

WGS-84經緯度轉Web墨卡托投影C#

clas double light param urn static 實測 坐標 [1] /// <summary> /// WGS84經緯度轉Web墨卡托投影 /// </summary>

七大經典排序Java

AR The 插入 構建 選擇 n個元素 升序 基準 互換 . 冒泡排序: 通過相鄰的兩個數的比較, 根據需要決定是否將兩個數互換位置, 然後將比較往前(或往後)推進. 最簡單的排序算法,直接上代碼。    for(i=0;i<lengt

快速排序C++實現

font std clu temp secure 最重要的 esp 代碼 else 快速排序的基本實現 快速排序算法是一種基於交換的高效的排序算法,它采用了分治法的思想: 1、從數列中取出一個數作為基準數(樞軸,pivot)。 2、將數組進行劃分(partition),將

冒泡排序js

更正 turn 基本 for循環 for amp 位置 發生 pre 基本思想:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直至沒有反序為止。 最初的冒泡排序(初級版): 1 //從小到大 2 function BubbleSort(arr){ 3 var

如何打造網站克隆、仿站工具C#

精神 復制 too empty 新建 webkit [] 處理 run 前兩天朋友叫我模仿一個網站,剛剛開始,我一個頁面一個頁面查看源碼並復制和保存,花了我很多時間,一個字“累”,為了減輕工作量,我寫了個網站“克隆工具”,一鍵克隆,比起人工操作, 效率提高了200%以上,精

簡單約瑟夫環模板C++

hdu2211 #include <bits/stdc++.h> using namespace std; int t; long long n,k; //函式返回的就是勝利者編號 long long cir(long long n,long long m){ /

樹形dp模板C++

poj2342 最簡單的樹形dp入門,樹上的最大點權獨立集 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int N=6e3

Prim模板C++

hiho1097 Prim和Dijkstra很像,這裡也是用鄰接矩陣存的,應該也能改成堆優化的吧,然後就是鬆弛條件那裡和dijk不一樣 #include <bits/stdc++.h> using namespace std; const int N=1e3+50; co

Kruskal模板C++

hiho1098 並查集 對邊權排序 貪心取邊權小的邊 #include <bits/stdc++.h> using namespace std; const int N=1e5+50; const int M=1e6+50; int n,m,u,v,w; int p[N

排序C實現

在資料結構中我們常見的排序演算法有:直接插入排序、希爾排序、選擇排序、堆排序、交換排序(氣泡排序)、快速排序、歸併排序,接下來我給大家分享一下我在寫這些程式碼時的想法(從小到大,從左到右),以及各個排序的比較 首先我們得寫一個交換函式,因為後面基本每個排序都有使用。 void Swap(in

資料結構——排序與查詢2——希爾排序C++實現

希爾排序原理 希爾排序(Shell’s Sort),也稱為“縮小增量排序”,是一種插入排序類的演算法。最簡單的插入排序,我在上一個專欄的一篇文章C++抽象程式設計——演算法分析(8)——插入排序演算法與分析有提到過,這裡就不再贅述,這裡就只介紹一些我以前沒寫過的演算法。 希爾排序是一

資料結構——排序與查詢3——氣泡排序C++實現

交換排序演算法 所謂交換,意思是說根據所給的序列,對其中的兩個元素進行大小比較,若為逆序,那麼我們就交換它。這樣就達到了排序的目的。接下來介紹最簡單的交換排序——氣泡排序。 氣泡排序的原理 氣泡排序的原理很簡單,它反覆遍歷要排序的列表,比較每對相鄰的專案,如果它們的順序錯誤則

資料結構實現:連結串列棧C++

資料結構實現(六):連結串列棧(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 入棧操作 2.2 出棧操作 2.3 查詢操作 2.4 其他操作 3. 演算法複雜度分析 3.1

資料結構實現:連結串列C++

資料結構實現(五):連結串列(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 增加操作 2.2 刪除操作 2.3 修改操作 2.4 查詢操作 2.5 其他操作 3. 演算法複雜度分析