冒泡排序与选择排序

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;
}

//思路:[0,bound)为有序区间,[bound,len)为无序区间,每趟在无序区间中找到最小的元素并与array[bound]交换
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;

}

      以上就是我所分享的冒泡排序和选择排序,如有表述不妥的地方,希望谅解!




  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
冒泡排序选择排序都是常见的排序算法,下面我会分别介绍一下它们的原理和实现。 冒泡排序是通过相邻元素的比较和交换来实现排序的。它的基本思想是从待排序的序列中依次比较相邻的两个元素,如果顺序不正确则进行交换,直到整个序列都有序。具体的实现步骤如下: 1. 从序列的第一个元素开始,依次比较相邻的两个元素。 2. 如果前一个元素大于后一个元素,则交换它们的位置。 3. 继续向后比较,直到最后一个元素。 4. 重复上述步骤,每次比较范围缩小一个元素,直到整个序列有序。 选择排序是通过不断地选择最小(或最大)的元素,并将其放到已排序序列的末尾来实现排序的。它的基本思想是从待排序的序列中选择一个最小(或最大)的元素,将其放到已排序序列的末尾,然后再从剩余未排序的序列中选择最小(或最大)的元素,重复这个过程,直到整个序列有序。具体的实现步骤如下: 1. 遍历整个序列,找到最小(或最大)的元素。 2. 将最小(或最大)的元素与当前遍历位置的元素交换位置。 3. 继续向后遍历,重复上述步骤,每次遍历范围缩小一个元素,直到整个序列有序。 冒泡排序选择排序都是比较简单直观的排序算法,但是它们的效率相对较低,当待排序序列较大时,它们的性能会下降。在实际应用中,可以考虑使用更高效的排序算法,如快速排序、归并排序等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值