C语言快速排序详解

目录

手敲快速排序

C语言调用标准库实现快速排序


手敲快速排序

#include<stdio.h>

int a[101], n;

void quicksort(int left, int right)
{
    int i, j, t, temp;
    if (left > right)
        return;
    i = left;//左哨兵
    j = right;//右哨兵
    temp = a[left];//基准数
    while (i != j)
    {
        //顺序很重要,要先从右往左找 
        while (a[j] >= a[left] && i < j)
            j--;
        //再从左往右找 
        while (a[i] <= a[left] && i < j)
            i++;
        //交换两个数在数组中的位置
        if (i < j)//当哨兵i和哨兵j没有相遇时
        {
            t = a[i];
            a[i] = a[j];
            a[j] = t;
        }        
    }
    //最终将基准数归位
    a[left] = a[i];
    a[i] = temp;

    quicksort(i + 1, right);//继续处理左边的,这里是一个递归的过程
    quicksort(left, i - 1);//继续处理右边的,这里是一个递归的过程
}

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    quicksort(0, n - 1);
    for (int i = 0; i < n - 1; i++)
        printf("%d ", a[i]);
    getchar();
    getchar();
    return 0;
}

C语言调用标准库实现快速排序

qsort 是 C 语言标准库中的一个函数,用于对数组进行快速排序。它的函数原型为:

cCopy code
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

其中,base 是指向要排序的数组的指针,nmemb 是数组中元素的个数,size 是每个元素的大小(以字节为单位),compar 是指向比较函数的指针。

比较函数 compar 接收两个指向要比较的元素的指针,返回值为整型。当第一个元素小于第二个元素时,返回一个负整数;当第一个元素等于第二个元素时,返回 0;当第一个元素大于第二个元素时,返回一个正整数。

以下是一个使用 qsort 函数对整型数组进行升序排序的例子:

#include <stdio.h>
#include <stdlib.h>
​
int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}
​
int main() {
    int arr[] = {5, 2, 8, 4, 1};
    int n = sizeof(arr) / sizeof(arr[0]);
​
    qsort(arr, n, sizeof(int), compare);
​
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
​
    return 0;
}

输出结果为:1 2 4 5 8

int n = sizeof(arr) / sizeof(arr[0]);这句代码什么意思

int n = sizeof(arr) / sizeof(arr[0]); 这句代码计算了数组 arr 中元素的个数,并将结果保存在变量 n 中。

在 C 语言中,sizeof 运算符可以用来计算一个变量或类型所占用的字节数。在这里,sizeof(arr) 计算的是整个数组 arr 所占用的字节数,sizeof(arr[0]) 则计算的是数组中第一个元素所占用的字节数。因为数组中所有元素的类型都相同,所以 sizeof(arr[0]) 可以代表数组中所有元素所占用的字节数。

因此,sizeof(arr) / sizeof(arr[0]) 就是计算数组 arr 中元素的个数。这个值可以用来确定需要排序的元素个数,以便在调用 qsort 函数时传递正确的参数。

int compare(const void *a, const void b) { return ((int*)a - (int)b); } 函数参数为什么要用指针

函数参数使用指针的原因是为了避免在函数调用时产生数组的副本,从而减少内存的使用。因为数组在内存中通常是连续存储的,所以可以通过指向数组第一个元素的指针来访问整个数组。

compare 函数中,参数 ab 都是 void 类型的指针,这意味着可以传递任何类型的指针作为参数,而不仅仅是整型数组的指针。在函数内部,首先将 ab 转换为 int 类型的指针,然后通过 * 运算符解引用指针,获取指针所指向的元素的值。最后将这两个元素的值相减,得到它们的大小关系。

由于 qsort 函数需要一个比较函数作为参数,而不同类型的数组元素可能需要不同的比较方式,因此 compare 函数使用了 void 类型的指针作为参数,可以适用于不同类型的数组元素。在使用时,只需要根据实际情况将 void 类型的指针转换为相应的类型即可。

函数参数使用指针的原因是为了避免在函数调用时产生数组的副本,从而减少内存的使用。 这样做为什么能避免产生数组的副本

使用指针作为函数参数可以避免产生数组的副本,是因为指针只是保存了数组第一个元素的地址,而不是将整个数组复制到函数的栈空间中。因此,使用指针作为函数参数可以减少内存的使用,从而提高程序的效率。

如果在函数调用时直接传递数组作为参数,那么函数会将整个数组复制到自己的栈空间中,这样会占用大量的内存。而使用指针作为参数,则只需要复制一个指针,指向原数组的第一个元素,这样就可以在函数内部访问整个数组的元素,而不必复制整个数组。

compare 函数中,使用指针作为参数可以避免在函数调用时复制整个数组。由于 compare 函数只需要访问数组元素的值,而不需要修改数组元素,所以使用指针作为参数是安全的。

int compare(const void *a, const void b) { return ((int*)a - (int)b); }中的const是什么意思有什么用

const 关键字用于声明一个常量,可以用来修饰函数参数或变量。在 compare 函数中,const 关键字用于修饰函数参数 ab,表示这些指针所指向的内存空间是只读的,不能被修改。

使用 const 关键字有助于提高程序的健壮性和可维护性。在函数中,如果不需要修改函数参数所指向的内存空间,那么就应该将参数声明为 const 类型,这样可以避免无意中修改了这些内存空间的值,从而导致程序出现错误。

compare 函数中,使用 const 关键字可以确保函数不会修改数组元素的值,从而保证了函数的安全性。如果不使用 const 关键字,那么在函数中可能会无意中修改数组元素的值,从而影响程序的正确性。

需要注意的是,const 关键字只能保证指针所指向的内存空间不被修改,而不能保证指针本身不被修改。如果需要保证指针本身不被修改,可以使用 const 修饰指针变量。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值