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()的调用