對於比較排序,你們若是感興趣,能夠查看個人博客:http://10740184.blog.51cto.com/10730184/1774508
ios
計數排序數組
思路:ide
咱們假設升序排序
排序序列爲2000,2001,3000,4000
遍歷序列,取出最小值min,最大值max,開闢一個空間爲max—min的空間大小的數組,遍歷數組a將排序序列a中的每一個元素出現的次數放在數組count的每一個a[i]-min處。就是說,2000出現一次了,把次數1放在2000-2000位置處,2001出現的次數放在2001-2000位置上,3000出現的次數放在3000-2000位置上,4000出現的次數放在4000-2000位置上,5000出現的次數放在5000-2000位置上。後面遇到相同元素了,那將該位置處的次數加加就統計出每一個元素的次數了。
這樣,對於數組count,裏面放的元素就是序列a的次數,count的下標就是a的元素。
往出來取元素的過程,就是拿出排序好的序列的過程。每次從數組count裏拿出下標,放回去就能夠了。若是此時count中的元素大於1,說明排序序列a有重複元素,那咱們多拿幾回就好了。spa
代碼實現:blog
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; #include<assert.h> #include<vector> void Print(vector<int> a) { for (int i = 0; i < a.size(); i++) { cout << a[i] << " "; } cout << endl; } void CountSort(vector<int>& a) { int max = a[0]; int min = a[0]; //找出序列的最大值與最小值,開闢max-min+1個空間大小的count數組 for (int i = 1; i < a.size(); i++) { if (max<a[i]) max = a[i]; if (min>a[i]) min = a[i]; } int* count = new int[max - min + 1]; memset(count, 0, (max - min + 1) * sizeof(int));//將數組初始化 /*對要排序的數組a進行個數統計,a數組的元素i就放在count數組的i-min處, 而不是i處。由於:若序列爲1000 2000 3000,開闢的count從下標0開始,就將1000放於count的1000-1000=0處*/ for (int i = 0; i < a.size(); i++) { count[a[i]-min]++; } //將count數組往回去拿,i+min表明還原下標 int j = 0; for (int i = 0; i < max - min + 1; i++) { while (count[i]>0)//此時該數重複n次,那就將該數拿回去n次 { a[j++] = i + min; count[i]--; } } } void TestCountSort() { vector<int> a = { 12, 34, 12222, 4568, 26, 1, 16, 10, 2, 4, 4, 93, 7, 5, 2, 4 }; CountSort(a); Print(a); } int main() { TestCountSort(); system("pause"); return 0; }
基數排序:排序
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; #include<assert.h> void Print(int* a,int size) { for (int i = 0; i < size; i++) { cout << a[i] << " "; } cout << endl; } int MaxRadix(int* a, int size) { int radix = 10; int count = 1; int i = 0; for (int i = 0; i<size; i++) { while (a[i] > radix) { radix *= 10; count++; } } return count; } void _PartRadix(int* a, int size,int divisor) { int count[10] = { 0 }; //處理數組count,統計每一個數據的個、10、百等位出現的個數 for (int i = 0; i < size; i++) { int num = a[i] / divisor; count[num % 10]++; } //處理數組start,統計每一個元素的起始位置 int start[10] = { 0 }; for (int i = 1; i < 10; i++) { start[i] = start[i - 1] + count[i - 1]; } //遍歷數組a,將這些元素放在tmp的計算好的位置上 int* tmp = new int[size]; for (int i = 0; i < size; i++) { int num = a[i] / divisor; tmp[start[num % 10]++] = a[i];//若該位有重複數,則加加座標向起始位置的後面放便可 } //拷回個位或十位或百位排序好的數組,開始下一個位的排序 for (int i = 0; i < size; i++) { a[i] = tmp[i]; } } void RadixSort(int* a, int size) { assert(a); for (int i = 1; i <= MaxRadix(a, size);i++) { int divisor = 1;//得到除數,便於依次獲得數據個位、十位、百位…… int k = i; while (--k) { divisor *= 10; } _PartRadix(a, size, divisor); } } void TestRadixSort() { int a[] = { 12, 34, 12222, 4568, 26, 1, 16, 10, 2, 4, 4, 93, 7, 5, 2, 4 }; RadixSort(a, sizeof(a) / sizeof(a[0])); Print(a,sizeof(a)/sizeof(a[0])); } int main() { TestRadixSort(); system("pause"); return 0; }