冒泡排序和qosrt函数实现

本文详细介绍了C语言中冒泡排序的实现以及qsort函数的使用,比较了两种排序算法在处理数组时的特点和效率,重点讲解了如何通过函数指针进行元素比较和交换。
摘要由CSDN通过智能技术生成

 1.冒泡排序

冒泡排序是两两相邻的两个元素进行比较,我们可以利用冒泡排序来进行对整型数组进行升序或者降序的排序

这里进行升序演示

例如:

使用冒牌排序之后变成

这里2和3交换了位置,而冒泡排序使用一次只会将一位最大的数移动到最右边如:

这里进行升序排序会变成

可以看到这里只进行了一次冒泡排序,而我们需要的不止是一次,因为冒泡是两两相邻进行比较,所以需要进行0~n-1次 (n代表的是数组的长度)

下面看代码#include<stdio.h>
void print(int arr[], int len)
{
    for (int i = 0; i < len-1; i++)  进行n-1次循环
    {
        for (int j = 0; j < len - i - 1; j++)  //循环一次之后,要比较的数就会减少一次,所以-i
        {
            if (arr[j] > arr[j+1])   //改成< 就是降序

   {
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}
int main()
{
    int arr[] = { 1,3,4,5,2,6,7,8,9 };
    int len =sizeof(arr) / sizeof(arr[0]);  //计算数组长度
    print(arr, len);
    for (int i = 0; i < len; i++)   //遍历数组
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

那要是要排序的数不要排序n-1次呢?我们可以进行改良

void bubble_sort(int arr[], int sz)//
//参数接收数组元素个数

{
    int i = 0;
    for (i = 0; i < sz - 1; i++)
    {
        int flag = 1;//
//假设这⼀趟已经有序了

        int j = 0;
        for (j = 0; j < sz - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                flag = 0;//
//发⽣交换就说明,⽆序

                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
        if (flag == 1)//
//这⼀趟没交换就说明已经有序,后续⽆序排序了

            break;
    }
}
int main()
{
    int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz);
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

2.qsort使用

首先看qsort的使用

void qsort (void* base, size_t num, size_t size,
           int (*compar)(const void*,const void*));

void* base 表示的是数组的地址 

size_t num 表示的是数组的元素

size_t size  表示的是数组的字节大小

int (*compar)(const void*,const void*) 是一个函数指针 返回的是int类型

const void*,const void* 表示要进行比较的两个数 相减  指向同一个空间的两个指针相减会变成一个整数,如果大于0表示e1大于e2交换位置,等于0表示相等, 小于0表示e1小于e2不交换位置

3.qsort函数模拟实现

void qsort (void* base, size_t num, size_t size,

int (*compar)(const void*,const void*));

qsort函数有这4个参数,分别是函数地址 ,数组元素,字节大小,和判断元素的大小

首先定义函数

_swap  完成数组元素的交换,因为qsort可以对任意类型数的交换,所以用char

 

bubble 4个参数  数组地址   元素总量   字节大小    函数指针比较大小

int_cmp  利用函数变量完成两个元素的判断,并返回一个整数

因为qsort函数可以进行任意类型元素进行交换,所以把数组类型强制转换为char*进行交换元素

j*size      j表示第几个元素,size是数组元素字节大小

if(cmp((char*)base + j * size, (char*)base + (j + 1) * size)>0)

因为形参是void*类型,所以强制转换为数组元素类型int*

指针进行减法,返回一个整数,如果大于0表示 arr[ j ]> arr[ j+1 ]

进行元素交换,size表示数组元素字节大小

强制转换为char*可以方便进行别的类型元素运算


         

  • 59
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值