算法导论代码 第8章 线性时间排序

8章 线性时间排序

8.2 计数排序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
void counting_sort(int A[], int n, int k)
{
	int *C = malloc(sizeof(int) * (k + 1));
	for (int i = 0; i <= k; i++) {
		C[i] = 0;
	}
	for (int i = 0; i < n; i++) {
		++C[A[i]];
	}
	for (int i = 1; i <= k; i++) {
		C[i] += C[i - 1];
	}
	int *B = malloc(sizeof(int) * n);
	for (int i = n - 1; i >= 0; i--) {
		B[C[A[i]] - 1] = A[i];
		--C[A[i]];
	}
	for (int i = 0; i < n; i++) {
		A[i] = B[i];
	}
	free(C);
	free(B);
}

void swap(void *a, void *b, size_t elem_size)
{
	if(a==NULL||b==NULL||a==b)
		return;
	char temp[elem_size];	/*变长数组 */
	memcpy(temp, a, elem_size);
	memcpy(a, b, elem_size);
	memcpy(b, temp, elem_size);
}
void randomized_in_place(void *array, size_t elem_size, int n)
{
	char *c_array = array;
	for (int i = 0; i < n; i++) {
		int index = rand() % (n - i) + i;
		swap(&c_array[i * elem_size], &c_array[index * elem_size],
		     elem_size);
	}
}

void print_array(int a[], int n)
{
	for (int i = 0; i < n; i++) {
		printf("%d ", a[i]);
	}
	printf("\n");
}

int main(void)
{
	srand((unsigned)time(NULL));
	int a[10];
	for (int i = 0; i < 10; i++) {
		a[i] = rand() % 10;
	}
	randomized_in_place(a, sizeof(int), 10);
	printf("排序前:\n");
	print_array(a, 10);
	counting_sort(a, 10, 9);
	printf("排序后:\n");
	print_array(a, 10);
	return 0;
}


8.3 基数排序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
int digit(int n, int w)
{
	static int base_array[20];
	if (base_array[0] == 0)	//求进制位的基值
	{
		base_array[0] = 1;
		for (int i = 1; i < 20; i++) {
			base_array[i] = base_array[i - 1] * 10;
		}
	}
	int n_base = base_array[w - 1];
	return n / n_base % 10;
}

void counting_sort(int A[], int n, int k, int w)
{
	int *C = malloc(sizeof(int) * (k + 1));
	for (int i = 0; i <= k; i++) {
		C[i] = 0;
	}
	for (int i = 0; i < n; i++) {
		++C[digit(A[i], w)];
	}
	for (int i = 1; i <= k; i++) {
		C[i] += C[i - 1];
	}
	int *B = malloc(sizeof(int) * n);
	for (int i = n - 1; i >= 0; i--) {
		B[C[digit(A[i], w)] - 1] = A[i];
		--C[digit(A[i], w)];
	}
	for (int i = 0; i < n; i++) {
		A[i] = B[i];
	}
	free(C);
	free(B);
}

void radix_sort(int A[], int n, int d)
{
	for (int i = 1; i <= d; i++) {
		counting_sort(A, n, 9, i);
	}
}

void swap(void *a, void *b, size_t elem_size)
{
	if(a==NULL||b==NULL||a==b)
		return;
	char temp[elem_size];	/*变长数组 */
	memcpy(temp, a, elem_size);
	memcpy(a, b, elem_size);
	memcpy(b, temp, elem_size);
}
void randomized_in_place(void *array, size_t elem_size, int n)
{
	char *c_array = array;
	for (int i = 0; i < n; i++) {
		int index = rand() % (n - i) + i;
		swap(&c_array[i * elem_size], &c_array[index * elem_size],
		     elem_size);
	}
}

void print_array(int a[], int n)
{
	for (int i = 0; i < n; i++) {
		printf("%d ", a[i]);
	}
	printf("\n");
}

int main(void)
{
	srand((unsigned)time(NULL));
	int a[10];
	for (int i = 0; i < 10; i++) {
		a[i] = rand()%1000;
	}
	randomized_in_place(a, sizeof(int), 10);
	printf("排序前:\n");
	print_array(a, 10);
	radix_sort(a,10, 3);
	printf("排序后:\n");
	print_array(a, 10);
	return 0;
}


8.4 桶排序

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
struct node {
	float value;
	struct node *next;
};
void node_ini(struct node *pnode, float value)
{
	pnode->value = value;
	pnode->next = NULL;
}

void insert_node(struct node *head, struct node *pnode)
{
	struct node *p = head;
	while (p->next != NULL) {
		if (p->next->value > pnode->value) {
			break;
		} else {
			p = p->next;
		}
	}
	pnode->next = p->next;
	p->next = pnode;
}

void bucket_sort(float A[], int n)
{
	struct node *node_array = malloc(sizeof(struct node) * n);
	for(int i=0;i<n;i++)
		node_ini(&node_array[i],0);
	for (int i = 0; i < n; i++) {
		struct node *p = malloc(sizeof(struct node));
		node_ini(p, A[i]);
		insert_node(&node_array[(int)(n * A[i])], p);
	}
	int k = 0;
	for (int i = 0; i < n; i++) {
		for (struct node * p = node_array[i].next; p != NULL;) {
			A[k++] = p->value;
			struct node *del = p;
			p = p->next;
			free(del);
		}
	}
	free(node_array);
}

void swap(void *a, void *b, size_t elem_size)
{
	if (a == NULL || b == NULL || a == b)
		return;
	char temp[elem_size];	/*变长数组 */
	memcpy(temp, a, elem_size);
	memcpy(a, b, elem_size);
	memcpy(b, temp, elem_size);
}

void randomized_in_place(void *array, size_t elem_size, int n)
{
	char *c_array = array;
	for (int i = 0; i < n; i++) {
		int index = rand() % (n - i) + i;
		swap(&c_array[i * elem_size], &c_array[index * elem_size],
		     elem_size);
	}
}

void print_array(float a[], int n)
{
	for (int i = 0; i < n; i++) {
		printf("%.2f ", a[i]);
	}
	printf("\n");
}

int main(void)
{
	srand((unsigned)time(NULL));
	float a[10];
	for (int i = 0; i < 10; i++) {
		a[i] = rand() / (float)RAND_MAX;
	}
	randomized_in_place(a, sizeof(int), 10);
	printf("排序前:\n");
	print_array(a, 10);
	bucket_sort(a, 10);
	printf("排序后:\n");
	print_array(a, 10);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值