基數排序(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. 演算法複雜度分析