桶排序:
就是标记一下是否出现过,再遍历一遍。(代码借(chao)鉴(xi))。
#include<iostream>
using namespace std;
int main() {
int input[11];
int heap[100] = {0};//初始化桶,排序0到100之间的数,heap[排序范围最大值]
int i;
for (size_t i = 1; i <=10 ; i++)
{
cin >> input[i];
heap[input[i]] = 1;//标志桶内有数据
}
for (size_t i = 0; i <100 ; i++)
{
if (heap[i]==1) {
cout << i << " ";//输出有数据桶的编号
}
}
cout << endl;
getchar();
return 0;
}
计数排序:
实质是将数字按位进行排序。
-
首先,类似桶排序,用一个count[]数组记录各位各个数字出现的次数。
-
其次,count[i]+=count[i-1],将各个i进行累加(这里保证了个位较大的数所对应的count[]也较大),用于输出数据的编号。
-
接着,就是将各位排序实践了,tmp[--count[k]] = data[i]。k为个位的数字,tmp[]储存暂时排好序的数字。
-
最后,循环最高位数的次数就好了。
* 参数说明:
* data-- 数组
* n -- 数组长度
* exp -- 指数。对数组a按照该指数进行排序。
*
* 例如,对于数组a={50, 3, 542, 745, 2014, 154, 63, 616};
* (01) 当exp=1表示按照"个位"对数组a进行排序
* (02) 当exp=10表示按照"十位"对数组a进行排序
* (03) 当exp=100表示按照"百位"对数组a进行排序
* ...
*/
void count_sort(int a[], int n, int exp)
{
int tmp[n]; // 存储"被排序数据"的临时数组
int i, count[10] = {0};
// 将数据出现的次数存储在count[]中
for (i = 0; i < n; i++)
count[ (data[i]/exp)%10 ]++;
// 更改conut[i]。目的是让更改后的conut[i]的值,是该数据在tmp[]中的位置。
for (i = 1; i < 10; i++)
count[i] += count[i - 1];
// 将数据存储到临时数组output[]中
for (i = n - 1; i >= 0; i--)
{
int k = data[i] / exp % 10;
tmp[--count[k]] = data[i];
}
// 将排序好的数据赋值给data[]
for (i = 0; i < n; i++)
data[i] = tmp[i];
}
代码改自:https://www.cnblogs.com/skywang12345/p/3603669.html,这位大佬说的挺好。