对于一般类型数据冒泡排序
(int 、double 、char 、flort)
代码:(int型)
void bubble_sort(int* arr){int len=sizeof(arr)/sizeof(int);int temp=0;for(int i=0;i<len-1;i++){for(int j=0;j<(len-i-1);j++){if(arr[j]<arr[j+1]){temp=arr[j];arr[j]=arr[i];arr[i]=temp;}}}
}
代码:(double型)
void bubble_sort(double* arr){int len=sizeof(arr)/sizeof(double);double temp=0;for(int i=0;i<len-1;i++){for(int j=0;j<(len-i-1);j++){if(arr[j]<arr[j+1]){temp=arr[j];arr[j]=arr[i];arr[i]=temp;}}}
}
代码:(char型)
void bubble_sort(char* arr){int len=sizeof(arr)/sizeof(char);char temp=0;for(int i=0;i<len-1;i++){for(int j=0;j<(len-i-1);j++){if(arr[j]<arr[j+1]){temp=arr[j];arr[j]=arr[i];arr[i]=temp;}}}
}
由上述代码发现,如果要编写通用型冒泡函数,我们需要解决以下问题:
- 传入排序数据的数据类型无法做到统一;
- 数据中转变量temp需要根据数据转换成相应的数据类型,以方便数据转换;
- 判断语句 if() 中数据中元素的比较无法统一比较方法;
通用型冒泡排序函数的演变过程
解决方法及代码实现:
//对于if()中的比较,直接自己编写比较函数,冒泡排序函数预留比较函数的形参位置即可;
//eg;int((*comp)(*void,*void))int comp_int(void* a,void* b){return *(int*)a - *(int*)b;
}int comp_double(void* a,void* b){return *(double*)a - *(double*)b;
}//对于数据类型,直接用void*arr代替即可;
//对于数据转换,直接使用memcpy,以及各种数据类型的字节大小传入即可;void bubble_sort(void* arr,int len,int size,int(*comp)(void*,void*)){char temp[size];memset(temp,0,size);for(int i=0;i<len-1;i++){for(int j=0;j<len-i-1;j++){if( comp(arr+j*size,arr+(j+1)*size) < 0 ){// temp = arr[j];// arr[j] = arr[j+1];// arr[j+1] = temp; memcpy(temp,arr+j*size,size);memcpy(arr+j*size,arr+(j+1)*size,size);memcpy(arr+(j+1)*size,temp,size);}}}
}
memcpy函数
函数原型:
void *memcpy(void *dest, const void *src, size_t n);
功能:
memcpy函数用于将指定数量的字节从源内存地址(src)复制到目标内存地址(dest)。
参数说明:
n : 要复制的字节数,类型为size_t表示要复制的字节的数量。
注意:
计算机中,任何数据最终都是二进制数,故只需有足够的空间,就可以将任何数据存储起来,相应的,读取时使用数据类型容器识别就可还原原本的意思。