第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;
}