目录
手敲快速排序
#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
函数中,参数 a
和 b
都是 void
类型的指针,这意味着可以传递任何类型的指针作为参数,而不仅仅是整型数组的指针。在函数内部,首先将 a
和 b
转换为 int
类型的指针,然后通过 *
运算符解引用指针,获取指针所指向的元素的值。最后将这两个元素的值相减,得到它们的大小关系。
由于 qsort
函数需要一个比较函数作为参数,而不同类型的数组元素可能需要不同的比较方式,因此 compare
函数使用了 void
类型的指针作为参数,可以适用于不同类型的数组元素。在使用时,只需要根据实际情况将 void
类型的指针转换为相应的类型即可。
函数参数使用指针的原因是为了避免在函数调用时产生数组的副本,从而减少内存的使用。 这样做为什么能避免产生数组的副本
使用指针作为函数参数可以避免产生数组的副本,是因为指针只是保存了数组第一个元素的地址,而不是将整个数组复制到函数的栈空间中。因此,使用指针作为函数参数可以减少内存的使用,从而提高程序的效率。
如果在函数调用时直接传递数组作为参数,那么函数会将整个数组复制到自己的栈空间中,这样会占用大量的内存。而使用指针作为参数,则只需要复制一个指针,指向原数组的第一个元素,这样就可以在函数内部访问整个数组的元素,而不必复制整个数组。
在 compare
函数中,使用指针作为参数可以避免在函数调用时复制整个数组。由于 compare
函数只需要访问数组元素的值,而不需要修改数组元素,所以使用指针作为参数是安全的。
int compare(const void *a, const void b) { return ((int*)a - (int)b); }中的const是什么意思有什么用
const
关键字用于声明一个常量,可以用来修饰函数参数或变量。在 compare
函数中,const
关键字用于修饰函数参数 a
和 b
,表示这些指针所指向的内存空间是只读的,不能被修改。
使用 const
关键字有助于提高程序的健壮性和可维护性。在函数中,如果不需要修改函数参数所指向的内存空间,那么就应该将参数声明为 const
类型,这样可以避免无意中修改了这些内存空间的值,从而导致程序出现错误。
在 compare
函数中,使用 const
关键字可以确保函数不会修改数组元素的值,从而保证了函数的安全性。如果不使用 const
关键字,那么在函数中可能会无意中修改数组元素的值,从而影响程序的正确性。
需要注意的是,const
关键字只能保证指针所指向的内存空间不被修改,而不能保证指针本身不被修改。如果需要保证指针本身不被修改,可以使用 const
修饰指针变量。