C语言选择排序法对简单类型与自定义类型的排序展示!!

  1. 源代码
#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;
}

  1. 运行结果
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值