普通冒泡:
#include <stdio.h>
void output(int *a,int n);//输出
void bubbleSort(int *a,int n);//冒泡
int main(int argc, char* argv[])
{
int a[]={1,3,2,5,4,7,6,8,9};
printf("排序后:\n");
output(a,sizeof(a)/sizeof(a[0]));
printf("\n冒泡排序后:\n");
bubbleSort(a,sizeof(a)/sizeof(a[0]));
output(a,sizeof(a)/sizeof(a[0]));
return 0;
}
void output(int *a,int n)//输出
{
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
void bubbleSort(int *a,int n)//冒泡
{
int tmp=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
}
运行结果:
以回调的方式进行冒泡:
#include <stdio.h>
bool greaterCmp(void * x, void * y);//大于
bool lessCmp(void * x, void * y);//小于
void swap(void* x,void* y,int size);//交换
void bubbleSort(void* arr,int n,int size,bool (*cmp)(void*,void*)); //冒泡排序
void output(void*arr,int n);//输出
int main(int argc, char* argv[])
{
int arr[]={1,5,2,3,6,7,4,9,8};
printf("原始数组:\n");
output(arr,sizeof(arr)/sizeof(arr[0]));
printf("冒泡排序(升)");
bubbleSort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),greaterCmp);
output(arr,sizeof(arr)/sizeof(arr[0]));
printf("冒泡排序(降)");
bubbleSort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),lessCmp);
output(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}
void output(void*arr,int n)
{
int num=0;
printf("\n");
int *s=(int *)arr;
for(int i=0;i<n;i++)
{
num=*((int *)s+i);
printf("%d ",num);
}
printf("\n");
}
bool greaterCmp(void * x,void * y)
{
return (*(int *)x> *(int *)y);
}
bool lessCmp(void * x, void * y)
{
return (*(int *)x< *(int *)y);
}
//统一强制转换为字符型数据,以字节的方式进行交互。
void swap(void* x,void* y,int size)
{
char tmp;
for(int i=0;i<size;i++)
{
tmp=*((char*)x+i);
*((char*)x+i)=*((char*)y+i);
*((char*)y+i)=tmp;
}
}
void bubbleSort(void* arr,int n,int size,bool (*cmp)(void*,void*))
{
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(cmp((char*)arr+j*size,(char*)arr+(j+1)*size))
{
swap((char*)arr+j*size,(char*)arr+(j+1)*size,size);
}
}
}
}
运行结果:
运行环境:VC++6.0