排序算法-计数排序

简介:

算法步骤:

  1. 通过桶排序获得数组分布情况。
  2. 辅助数组记录对应下标前数值的分布情况(计数)
  3. 通过辅助数组的计数作为下标打印输出

详解:
在这里插入图片描述通过分布情况,可以构建辅助数组,用来记录对应下标前待排序内容出现的次数。

1235

举个例子:如上所述,对应下标2之前有两个待排序数组,算上自己就有了3个待排数字。则如果打印数组,则下标2则需要在输出数组的第三个位置打印。
该算法的关键在于通过数值出现的次数值作为下标来达到排序的目的。

代码:
#include<bits/stdc++.h>
using namespace std;
void sort_count(int *n, int len){
 	int t1[1024], t2[1024], m[len];
 	memset(t1, 0, sizeof(t1));//辅助数组t1/t2初始化 
 	memset(t2, 0, sizeof(t2));
 	for(int i = 0; i < len; i++){//散列待排序内容 
  		t1[n[i]]++;
 	}
 	t2[0] = t1[0];
 	for(int i = 1; i < 1024; i++){//计数
  		t2[i] = t2[i-1] + t1[i];
 	}
 	for(int i = 0; i < len; i++){//计数值作为下标 
  		m[--t2[n[i]]] = n[i];//容易出错
 	}
 	for(int i = 0; i < len; i++){//数组赋值,刷新数组n 
  		n[i] = m[i];
 	}
}
int main(){
 	int len = 5;
 	int n[len];
 	for(int i = 0; i < len; i++){
  		cin >> n[i];
 	}
 	sort_count(n, len);
 	for(int i = 0; i < len; i++){
  		cout << n[i] << endl;
 	} 
 	return 0;
}

计数排序的时间复杂度为O(n+k)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值