桶排序与计数排序

桶排序:

就是标记一下是否出现过,再遍历一遍。(代码借(chao)鉴(xi))。

#include
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;
}

计数排序:

实质是将数字按位进行排序。

  1. 首先,类似桶排序,用一个count[]数组记录各位各个数字出现的次数。

  2. 其次,count[i]+=count[i-1],将各个i进行累加(这里保证了个位较大的数所对应的count[]也较大),用于输出数据的编号。

  3. 接着,就是将各位排序实践了,tmp[--count[k]] = data[i]。k为个位的数字,tmp[]储存暂时排好序的数字。

  4. 最后,循环最高位数的次数就好了。

* 参数说明:
 *     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,这位大佬说的挺好。

你可能感兴趣的:(排序)