1.冒泡排序
首先说一下什么是冒泡排序?它的思想是什么?以对数组array中的n个元素进行冒泡排序为例,对于数组array的n个元素进行排序共需要排(n-1)趟,其中每一趟排序是将数组中的未排序的两两元素进行比较,若array[j]>array[j+1],则两者进行交换,此时为升序排序;若array[j]<array[j+1],则两者进项交换,此时为降序排序。。下面进行具体举例:
下面实现冒泡排序的代码:
//思路:假设数组array有n个元素,则需要排n-1趟,在第i趟中又比较n-1-i次
static void swap(int* a,int* b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}
void BubbleSort(int* array,int len)
{
//判断形参array是否合法
if(array==NULL)
return;
int i=0;
for(i=0;i<len-1;i++) //趟数
{
int j=0;
for(j=0;j<len-1-i;j++) //每趟比较的次数
{
if(array[j]>array[j+1]) //按升序排列
{
swap(&array[j],&array[j+1]);
}
}
}
}
int main()
{
int array[]={2,1,5,3,9,4,6};
int len=sizeof(array)/sizeof(array[0]);
BubbleSort(array,len);
int i=0;
for(i=0;i<len;i++)
printf("%d ",array[i]);
return 0;
}
那么问题来了,如果用户想要用你编写的函数进行降序排序呢?是不是需要你去修改你自己的代码,这就造成了用户没法按照自己的意愿去升序或降序排列。所以下面介绍另一种方法,能够让用户有选择的排序。在上一方法的基础上增加一个参数,用来接收函数的地址,从而在该函数体内调用所接收的函数,若用户传入的第三个参数是要升序排列的函数,则进行升序排列;若用户传入的第三个参数是要降序排列的函数,则进行降序排列。那么问题又来了,第三个参数用什么样的数据类型接受呢?当然是函数指针了,故需要我们去自定义一个函数指针类型的数据类型:typedef int(*Cmp)(int x,int y);将其在头文件中实现。具体代码如下:
//思路:在方法一的基础上增加一个参数,用来接收函数的地址,从而在该函数体内调用所接收的函数
void BubbleSortEx(int* array,int len,Cmp cmp)
{
//判断形参array,cmp是否合法
if(array==NULL||cmp==NULL)
return;
int i=0;
for(i=0;i<len-1;i++) //趟数
{
int j=0;
for(j=0;j<len-1-i;j++) //每趟比较的次数
{
if(cmp(array[j],array[j+1]))
{
//满足if的要求,则交换。为升序还是降序则需要看传入的第三个参数对应的函数的功能是什么
swap(&array[j],&array[j+1]);
}
}
}
//asc_sort( )和desc_sort( )函数是用户可以自己去定义的函数,用于用户选择什么样的方式去排序(升序/降序)
int asc_sort(int x,int y) //升序选择
{
return x>y?1:0;
}
int desc_sort(int x,int y) //降序选择
{
return x<y?1:0;
}
//主函数的实现,测试所写的函数功能是否正确
int main(){
int array[]={2,1,5,3,9,4,6};
int len=sizeof(array)/sizeof(array[0]);
printf("以升序排序\n");
BubbleSortEx(array,len,arc_sort);
int i=0;
for(i=0;i<len;i++)
printf("%d ",array[i]);
printf("\n");
printf("以降序排序\n");
BubbleSortEx(array,len,desc_sort);
for(i=0;i<len;i++)
printf("%d ",array[i]);
printf("\n");
return 0;
}
2.选择排序
同冒泡排序一样,首先来说一下什么是选择排序?它的思想是什么?以整形数组array含有n个元素为例,每一趟需要从未排序的元素中找到最大的元素或最小的元素,然后从与数组第一个元素开始交换,直到所有元素都能得以排序。具体举例如下所示:
下面实现选择排序的代码:
//交换两数的值的函数
static void swap(int* a,int* b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}
void SelectSort(int* array,int len)
{
//判断形参array是否合法
if(array==NULL)
return;
//判断数组的有效元素是否<=1,若是则不用排序;若不是则进行排序
if(len<=1)
return;
int bound=0;
for(bound=0;bound<len-1;bound++) //趟数
{
int cur=bound+1;
for(cur=bound+1;cur<len;cur++) //每趟比较的次数
{
if(array[bound]>array[cur])
//满足if就交换,表示以升序的方式排序
swap(&array[bound],&array[cur]);
}
}
}
//主函数的代码,测试所写的选择排序是否正确
int main()
{
int array[]={2,1,5,3,9,4,6};
int len=sizeof(array)/sizeof(array[0]);
SelectSort(array,len);
int i=0;
for(i=0;i<len;i++)
printf("%d ",array[i]);
return 0;
}
方法二:同冒泡排序一样使用函数指针的方法,使得用户可以有选择的去进行升序或者降序排序//思路:在方法一的基础上增加一个参数,用来接收函数的地址,从而在该函数体内调用所接收的函数void SelectSortEx(int* array,int len,Cmp cmp)
{
//判断形参array,cmp是否合法
if(array==NULL||cmp==NULL)
return;
//判断数组的有效元素是否<=1,若是则不用排序;若不是则进行排序
if(len<=1)
return;
int bound=0;
for(bound=0;bound<len;bound++) //趟数
{
int cur=bound+1;
for(cur=bound+1;cur<len;cur++) //每趟比较的次数
{
if(cmp(array[bound,array[cur]))
{
swap(&array[bound],&array[cur]);
}
}
}
}
//asc_sort( )和desc_sort( )函数是用户可以自己去定义的函数,用于用户选择什么样的方式去排序(升序/降序)
int asc_sort(int x,int y) //升序选择
{
return x>y?1:0;
}
int desc_sort(int x,int y) //降序选择
{
return x<y?1:0;
}
//主函数的实现,测试所写的函数功能是否正确
int main()
{int array[]={2,1,5,3,9,4,6};
int len=sizeof(array)/sizeof(array[0]);
printf("以升序排序\n");
SelectSortEx(array,len,arc_sort);
int i=0;
for(i=0;i<len;i++)
printf("%d ",array[i]);
printf("\n");
printf("以降序排序\n");
SelectSortEx(array,len,desc_sort);
for(i=0;i<len;i++)
printf("%d ",array[i]);
printf("\n");
return 0;
}
以上就是我所分享的冒泡排序和选择排序,如有表述不妥的地方,希望谅解!