快排函数的调用qsort();

1.快排函数的介绍:

快速排序(Quicksort)是对冒泡排序的一种改进。也是最快的一种排序算法。

2.核心思想:

快速排序算法通过多次比较和交换来实现排序,其排序流程如下: 

(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。  

(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。  

(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。  

(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。 

3.快速排序的代码实现:

#include<stdio.h>
void sort(int *a, int n)
{
    if(n<=1)
	return;
    int i=0,j=n-1,t,temp=a[0];
    while(i<j)
	{
        while( a[j]>temp && j>i )
		j--;
		a[i] = a[j];
        while( a[i]<=temp && i<j )
		i++;
		a[j] = a[i];
    }
    a[i] = temp;
    sort(a, i);
    sort(a+i+1, n-i-1);
    return;
}
main() 
{
    int i,n,a[99];
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    sort(a,n);
    for(i=0;i<n;i++) 
	{
        printf("%d ", a[i]);
    }
}

这就是快排的最简单的一个手打代码。

4.快排函数的调用qsort();

自己在实际刷题中发现快排代码很长,很浪费时间,通过查询C语言库函数,发现快排的函数在stdlib.h中便包含,于是学习了qsort函数的用法

这个函数的调用如下:

qsort(a,n,sizeof(int),cmp)

a是所需要排序的数组,n是排序的个数,sizeof(int)所需要排序的一个数的空间大小,cmp函数需要自己写出

cmp函数如int cmp(const void *a, const void *b)中有两个元素作为参数,返回一个int值,如果比较函数返回大于0,qsort就认为a > b,返回小于0,qsort就认为a < b。qsort知道元素的大小了,就可以把大的放前面去。如果你的比较函数返回本来应该是1的(即a > b),而却返回-1(小于0的数),那么qsort认为a < b,就把b放在前面去,但实际上是a > b的,所以就造成了降序排序的差别了。const void *a这是定义了一个指针a,a可以指向任意类型的值,但它指向的值必须是常量,在这种情抄况下,我们不能修改被指向的对象,但可以使指针指向其他对象。

5.关于快排函数的调用示例代码:

对整型数据的排序:
#include<stdio.h>
#include<stdlib.h>
int cmp(const void*a,const void*b)
{
	return *(int*)a-*(int*)b;
}
main()
{
	int a[99];
	int n,i;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
	scanf("%d",&a[i]);	
	} 
	qsort(a,n,sizeof(int),cmp);
	for(i=0;i<n;i++)
	{
		printf("%d ",a[i]);
	}
 }

那么这是整形的,字符串的排序cmp函数则是这样一修改即可实现

对字符串的排序:
int Comp(const void*p1,const void*p2)
{
return strcmp((char*)p2,(char*)p1);
}
int main()
{
char a[MAX1][MAX2];
initial(a);
qsort(a,lenth,sizeof(a[0]),Comp);

这就是本周所学习到的快排函数qsort()的调用

猜你喜欢

转载自blog.csdn.net/m0_46110288/article/details/105893602