- 源代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<windows.h>
#define MAX_NUM 10
void select_sort(int arr[],int len) { //普通版本的选择排序
for (int i = 0; i < len; i++) {
int min = i;
for (int j = i; j < len; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
if (i != min) {
arr[i] ^= arr[min] ^= arr[i] ^= arr[min];
}
}
}
void print_arr(int arr[], int len) { //普通打印数组函数
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void test1() {//普通版本的选择排序
int arr[MAX_NUM];
for (int i = 0; i < MAX_NUM; i++) {
arr[i] = rand() % 20;
}
printf("排序前:\n");
print_arr(arr, MAX_NUM);
select_sort(arr, MAX_NUM);
printf("排序后:\n");
print_arr(arr, MAX_NUM);
}
typedef struct person {
char name[30];
int age;
}PERSON;
int compare(void const *p1, void const *p2) { //自定义类型大小比较
PERSON *p3 = (PERSON*)p1;
PERSON *p4 = (PERSON*)p2;
if (p3->age > p4->age) { //按照年龄从小到大排序返回1
return 1;
}
if (p3->age < p4->age) { //按照年龄从大到小排序返回-1
return -1;
}
return 0;
}
//高级版本选择排序(可以将自定义类型进行排序)
void select_sort2(void *arr, int len,int ele_size,int (*compare)(void const*,void const*)) {
for (int i = 0; i < len; i++) {
int min = i;
for (int j = i; j < len; j++) {
void *pi = (char *)arr + i * ele_size;
void *pj = (char *)arr + j * ele_size;
int ret = compare(pi, pj);
if (ret==1) {
min = j;
}
}
if (i != min) {
void *temp = (void *)malloc(sizeof(char)*ele_size);
memcpy(temp, (char*)arr + i * ele_size, ele_size);
memcpy((char*)arr + i * ele_size, (char*)arr + min * ele_size, ele_size);
memcpy((char*)arr + min * ele_size, temp, ele_size);
free(temp);
temp = NULL;
}
}
}
void print_PERSON(PERSON *p,int len) {
for (int i = 0; i < len; i++) {
printf("NAME:%s AGE:%d\n", p[i].name,p[i].age);
}
printf("\n");
}
int main(void) {
printf("普通版本选择排序功能!\n");
test1();
printf("\n------------------------------\n");
printf("高级版本自定义类型排序的选择排序功能!\n");
PERSON p[] = {
{"aaaaaa",10},
{"bbbbbb",35},
{"cccccc",25},
{"dddddd",60},
{"eeeeee",5}
};
int len = sizeof(p) / sizeof(p[0]);
printf("排序前:\n");
print_PERSON(p, len);
printf("排序后:\n");
select_sort2(p, len, sizeof(PERSON), compare); //高级版本选择排序(可以将自定义类型进行排序)
print_PERSON(p, len);
printf("\n");
system("pause");
return 0;
}
- 运行结果