#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

void swap(char*a, char*b, int wid){
	//因为我们不知道要替换的两个值占内存多大
	//所以选择把这个值变成char类型,char字节占一个字节
	//而传进去的wid就是一个数组的元素有多少个字节
	//将a和b交换
	int i = 0;
	for (i = 0; i < wid; i++, a++,b++)
	{
		char tmp = *a;
		*a = *b;
		*b = tmp;		
	}
}


int duibi(void*a, void*b){
	//这里是可更改的函数,作用是用传进来的数组的第一个数减去第二个数得到一个大于0等于0和小于0的数字
	//大于0则a>b 小于0则a<b 等于0则a=b
	return *(int*)a - *(int*)b;
}


void mppx(void*suzu, int sz, int wid, int(*cmp)(void*e1,void*e2)){
	int i = 0;
	for ( i = 0; i < sz-1; i++)
	{
		int j = 0;
		for ( j = 0; j < sz-1-i; j++)
		{
			//替换
			if (cmp((char*)suzu + j*wid, (char*)suzu + (j+1)*wid)>0)
				//指针加减
			{
				swap((char*)suzu + j*wid, (char*)suzu + (j + 1)*wid,wid);
			}
		}
	}
}


void intlx(){
	int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	mppx(arr, sz, sizeof(arr[0]), duibi);
	//万用冒泡排序,适用于任何类型的比较
	//mppx(数组,元素个数,单个元素个数占用的内存,进行比较的函数)
	for ( i = 0; i < sz; i++)
	{
		printf("%d", arr[i]);
	}
}

int main(){
	intlx();
	return 0;
}