提交 ea0745da 编写于 作者: 独孤过's avatar 独孤过

泛型排序

上级 5c4c88f5
# 简介
## 简介
存放C语言之路的精选代码,代码按照语言特性、数据结构、算法、设计模式、工具库分类。
仓库地址:https://gitee.com/solifree/pure-c.git
# 语言特性
## ctype.h
## 语言特性
### ctype.h
大小写字母转换
## math.h
### math.h
圆面积
## string.h
### string.h
strcpy
# 数据结构
## 数据结构
# 算法
二分查找
## 算法
枚举法
交换
枚举法
## 矩阵
排序
二分查找
### 矩阵
转置
## 排序
冒泡排序
插入排序
选择排序
## 数学
### 数学
质数
分解质因数
阶乘
排列数
组合数
# 设计模式
## 设计模式
# 工具库
## 工具库
CPU架构字节序
程序位数
不重复随机数
隐藏密码
## 日期
### 日期
平年与闰年
年中天数
星期天数
## 文件
### 文件
重定向
# 其他
## 其他
作者:许聪
QQ:2592419242
CSDN:https://blog.csdn.net/xucongyoushan
......
.SUFFIXES:.C .O
.SUFFIXES:.c .o
CC=gcc
......
# 项目
隐藏密码
# 隐藏密码
项目地址:https://gitee.com/solifree/pure-c/tree/master/工具库/隐藏密码
仓库地址:https://gitee.com/solifree/pure-c.git
# 简介
## 简介
输入密码之时,显示星号代替密码。
# 功能
## 功能
1. 支持Backsoace键删除已输入密码,Enter键结束输入,输入密码长度与设置密码相同则自动结束输入。
2. 代码可跨平台,支持在Windows和Linux编译运行。
# 用法
## Windows
## 用法
### Windows
单独编译源文件main.c,生成可执行程序。
## Linux
### Linux
切换至根目录,执行以下命令构建项目,生成测试程序test,于终端执行。
```shell
make linux
......@@ -24,7 +23,7 @@ make linux
make clean
```
# 其他
## 其他
作者:许聪
QQ:2592419242
CSDN:https://blog.csdn.net/xucongyoushan
......
.SUFFIXES:.c .o
CC=gcc
# SRCS=swap.c bubble_sort.c test.c
# SRCS=swap.c insert_sort.c test.c
SRCS=swap.c select_sort.c test.c
OBJS=$(SRCS:.c=.o)
EXEC=test
linux: $(OBJS)
$(CC) $(OBJS) -o $(EXEC)
@echo "----------Build successfully----------"
.c.o:
$(CC) -Wall -o $@ -c $<
clean:
rm $(OBJS) $(EXEC)
# 排序
项目地址:https://gitee.com/solifree/pure-c/tree/master/算法/排序
仓库地址:https://gitee.com/solifree/pure-c.git
## 简介
以前写过排序函数,现再封装成泛型排序。
## 功能
泛型排序函数适用于数组,参数包含数组指针、元素数量、元素大小、函数指针和上下文指针。
函数指针支持自定义比较函数,上下文指针支持传递额外参数。
各文件作用如下表所示:
文件|介绍
-|-
gtsort.h|排序接口
swap.c|泛型交换
bubble_sort.c|冒泡排序
insert_sort.c|插入排序
select_sort.c|选择排序
test.c|测试代码
## 用法
### Windows
选择gtsort.h、swap.c、test.c,以及bubble_sort.c、insert_sort.c、select_sort.c其中之一编译。
### Linux
切换至根目录,执行以下命令构建,生成测试程序test,于终端执行。
```shell
make linux
```
执行以下命令清理项目,删除中间文件和测试程序。
```shell
make clean
```
## 其他
作者:许聪
QQ:2592419242
CSDN:https://blog.csdn.net/xucongyoushan
gitee:https://gitee.com/solifree
github:https://github.com/xucongandxuchong
#include "gtsort.h"
static inline void *address(
void *ptr, \
size_t num, \
size_t size)
{
return (void*)((size_t)ptr + num*size);
}
void sort(
void *ptr, \
size_t num, \
size_t size, \
int(*comp)(const void*, const void*, void*), \
void *ctx)
{
if (ptr == NULL || num*size == 0 || comp == NULL)
return;
void *context = NULL;
void *left, *right;
for (size_t i = num - 1, j; i > 0; --i)
for (j = 0; j < i; ++j)
if (comp(left = address(ptr, j, size), \
right = address(ptr, j + 1, size), ctx) > 0)
context = swap(left, right, size, context);
swap(NULL, NULL, 0, context);
}
#ifndef SWAP_H
#define SWAP_H
#include <stddef.h>
#if defined(_WIN32) && defined(_MSC_VER)
#define restrict __restrict
#endif
void *swap(
void *restrict left, \
void *restrict right, \
size_t size, \
void *context);
void sort(
void *ptr, \
size_t num, \
size_t size, \
int(*comp)(const void*, const void*, void*), \
void *ctx);
#endif
\ No newline at end of file
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include "gtsort.h"
static inline void *address(
void *ptr, \
size_t num, \
size_t size)
{
return (void*)((size_t)ptr + num*size);
}
void sort(
void *ptr, \
size_t num, \
size_t size, \
int(*comp)(const void*, const void*, void*), \
void *context)
{
if (ptr == NULL || num*size == 0 || comp == NULL)
return;
void *key = malloc(size);
for (size_t i, j = 1; j < num; ++j)
{
memcpy(key, address(ptr, j, size), size);
i = j - 1;
while (true)
{
if (comp(address(ptr, i, size), key, context) <= 0)
{
memcpy(address(ptr, i + 1, size), key, size);
break;
}
memcpy(address(ptr, i + 1, size), \
address(ptr, i, size), size);
if (i == 0)
{
memcpy(address(ptr, i, size), key, size);
break;
}
--i;
}
}
free(key);
}
#include "gtsort.h"
static inline void *address(
void *ptr, \
size_t num, \
size_t size)
{
return (void*)((size_t)ptr + num*size);
}
void sort(
void *ptr, \
size_t num, \
size_t size, \
int(*comp)(const void*, const void*, void*), \
void *ctx)
{
if (ptr == NULL || num*size == 0 || comp == NULL)
return;
void *context = NULL;
for (size_t i = 0, j, k, counter = num - 1; i < counter; ++i)
{
for (j = i + 1, k = i; j < num; ++j)
if (comp(address(ptr, k, size), \
address(ptr, j, size), ctx) > 0)
k = j;
context = swap(address(ptr, i, size), \
address(ptr, k, size), size, context);
}
swap(NULL, NULL, 0, context);
}
#include <string.h>
#include <stddef.h>
#include <stdlib.h>
#include "gtsort.h"
void *swap(
void *restrict left, \
void *restrict right, \
size_t size, \
void *context)
{
if (left == NULL || right == NULL || size == 0)
{
free(context);
return NULL;
}
if (left == right)
return context;
if (context && *(size_t*)context < size)
{
free(context);
context = NULL;
}
if (context == NULL)
{
context = malloc(sizeof(size_t) + size);
*(size_t*)context = size;
}
void *buffer = (void*)((size_t)context + sizeof(size_t));
memcpy(buffer, left, size);
memcpy(left, right, size);
memcpy(right, buffer, size);
return context;
}
#include <stdio.h>
#include <stdio.h>
void sort(int array[], int size)
#include "gtsort.h"
int compare(const void *left, const void *right, void *context)
{
if (array == NULL)
return;
for (int i, j = 1, key; j < size; ++j)
{
key = array[j];
i = j - 1;
while (i >= 0 && array[i] > key)
{
array[i + 1] = array[i];
--i;
}
array[i + 1] = key;
}
int prev = *(const int*)left;
int next = *(const int*)right;
if (prev < next)
return -1;
else if (prev > next)
return 1;
else
return 0;
}
#define N 9
#define N 10
int main()
{
int array[N];
printf("输入%d个整数:", N);
printf("输入%d个整数:", N);
for (int i = 0; i < N; ++i)
scanf("%d", &array[i]);
sort(array, N);
printf("排序之后:");
sort(array, N, sizeof(int), compare, NULL);
printf("排序之后:");
for (int i = 0; i < N; ++i)
printf("%d ", array[i]);
puts("\b");
......
#include <stdio.h>
static inline void swap(int *left, int *right)
{
if (left == right)
return;
int temp = *left;
*left = *right;
*right = temp;
}
void sort(int array[], size_t size)
{
if (array == NULL || size == 0)
return;
for (size_t i = size - 1, j; i > 0; --i)
for (j = 0; j < i; ++j)
if (array[j] > array[j + 1])
swap(array + j, array + j + 1);
}
#define N 9
int main()
{
int array[N];
printf("输入%d个整数:", N);
for (int i = 0; i < N; ++i)
scanf("%d", &array[i]);
sort(array, N);
printf("排序之后:");
for (int i = 0; i < N; ++i)
printf("%d ", array[i]);
puts("\b");
return 0;
}
#include<stdio.h>
static inline void swap(int *left, int *right)
{
if (left == right)
return;
int temp = *left;
*left = *right;
*right = temp;
}
void sort(int array[], size_t size)
{
if (array == NULL)
return;
for (size_t i = size, j, k; i > 0; --i)
{
for (j = 1, k = 0; j < i; ++j)
if (array[k] < array[j])
k = j;
swap(array + k, array + j - 1);
}
}
#define N 10
int main()
{
int array[N];
printf("输入%d个整数:", N);
for (int i = 0; i < N; ++i)
scanf("%d", &array[i]);
sort(array, N);
printf("排序之后:");
for (int i = 0; i < N; ++i)
printf("%d ", array[i]);
puts("\b");
return 0;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册