C语言高级进阶
排序算法学习内容
排序算法实现学习产出
简单冒泡排序算法,排序整数数组 实现代码如下:bubble_sort(int arr[],int sz)
{
for(int i=0; i<sz-1;i++)
{
for(int j=0;j<sz-1-i;j++)
{
if(arr[j]>arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
int main()
{
int arr[10] = {9,8,7,6,5,4,3,2,1,0};
int sz = sizeof(arr)/sizeof(arr[0]);
for(int i=0;i<sz;i++)
{
printf("%d\t", arr[i]);
}
printf("\n");
bubble_sort(arr,sz);
int i;
for(i=0;i<sz;i++)
{
printf("%d\t", arr[i]);
}
}
运行结果如下:
快速排序算法,排序任意类型数据
实现代码如下:
#include <stdlib.h>
int cmp_int(void *e1, const void* e2)
{
return *(int *)e1 - *(int *)e2;
}
void test1()
{
int arr[10] = {9,8,7,6,5,4,3,2,1,0};
int sz = sizeof(arr)/sizeof(arr[0]);
qsort(arr,sz,sizeof(arr[0]),cmp_int);
for(int i=0;i<sz;i++)
{
printf("%d\t", arr[i]);
}
printf("\n");
}
int cmp_float(const void* e1, const void* e2)
{
return (int)(*(float*)e1 - *(float *)e2);
}
void test2()
{
float arrf[] = {9 , 7, 6, 5, 3, 1};
int sz = sizeof(arrf)/sizeof(arrf[0]);
qsort(arrf,sz,sizeof(arrf[0]),cmp_float);
for(int i=0;i<sz;i++)
{
printf("%f\t", arrf[i]);
}
printf("\n");
}
int main()
{
test1();
test2();
return 0;
}
此函数要求调用者自己实现比较方法函数。
运行结果如下:
经分析以上代码中针对浮点数的排序算法有bug,主要出现在比较函数中对浮点型运算进行强制类型转换为整型后小数部分丢失,这样就无法排序两者差值小于1的浮点数据了。
int cmp_float(const void* e1, const void* e2)
{
return (int)(*(float*)e1 - *(float *)e2);
}
更改后的代码如下:
int cmp_float(const void* e1, const void* e2)
{
return ((*(float*)e1 - *(float *)e2) >0) ? 1 : ((*(float*)e1 - *(float *)e2) < 0) ? -1 : 0;
}
void test2()
{
float arrf[] = {9.7 , 9.5, 9.36, 9.4, 9.43, 9.6};
int sz = sizeof(arrf)/sizeof(arrf[0]);
qsort(arrf,sz,sizeof(arrf[0]),cmp_float);
for(int i=0;i<sz;i++)
{
printf("%.2f\t", arrf[i]);
}
printf("\n");
}
int main()
{
test2();
return 0;
}
运行结果如下:
此处比较函数运用了条件表达式,使得代码更简洁,也可以用if , else表达式轻松实现,代码如下:
int cmp_float(const void* e1, const void* e2)
{
// return ((*(float*)e1 - *(float *)e2) >0) ? 1 : ((*(float*)e1 - *(float *)e2) < 0) ? -1 : 0;
if((*(float*)e1 - *(float *)e2) >0)
return 1;
else if((*(float*)e1 - *(float *)e2) <0)
return -1;
else
return 0;
}