桶排序


思路:计算数组的值域,以10为差值区间映射入桶中,每个桶用链表的结构存储,对新数据按插入排序插入,最后遍历桶,得到最终序列


#include <stdio.h>
#include <stdlib.h>


#define LENGTH 10000001
int a[LENGTH];


void print(int* a, int x, int y) {
	int i;
	for (i = x; i < y + 1; i++)
		printf("%d ", a[i]);
	printf("\n");
}


struct bucket {
	int key;
	struct bucket *next;
};


void bucket_sort(int* a, int n) {
	int i, k;
	int min, max, buck_num;
	min = max = a[0];
	for (i = 0; i < n; i++) {
		min = a[i] < min ? a[i] : min;
		max = a[i] > max ? a[i] : max;
	}
	buck_num = (max - min + 1) / 10 + 1;


	struct bucket *pBucket,*p;
	pBucket = (struct bucket*) malloc(sizeof(struct bucket) * buck_num);
	memset(pBucket, 0, sizeof(struct bucket) * buck_num);


	p = (struct bucket*)malloc(sizeof(struct bucket));
	for (i = 0; i < buck_num; i++){
		p = pBucket + i;
		p->next = NULL;
	}


	for (i = 0; i < n; i++) {
		k = (a[i] - min + 1) / 10;
		p = pBucket + k;
		struct bucket *newBucket;
		newBucket = (struct bucket*)malloc(sizeof(struct bucket));


		while(p->next != NULL){
			if(p->next->key > a[i])
				break;
			p = p->next;
		}
		newBucket->key = a[i];
		newBucket->next = p->next;
		p->next = newBucket;
	}


	int pos = 0;
	for (i = 0; i < buck_num; i++){
		p = pBucket + i;
		while(p->next != NULL){
			p = p->next;
			a[pos++] = p->key;
		}
	}


}


int main() {
	//freopen("sort.in", "r", stdin);
	int n, i;


	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &a[i]);
	bucket_sort(a, n);
	print(a,0,n-1);
	return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值