快速排序——qsort(a, n, sizeof(int), cmp);

定义:

通过一趟排序将要排序的数据分割成两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后按此方法对两部分数据分别进行快速排序,整个快速排序过程可用递归实现。

做法:

设要排序的数组是A[0].....A[n-1],首先任取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数放它前面,所有比它大的数放它后面,这个过程称为一趟快速排序。

野生方法:

让i 指关键数的右边一个,j指数组的最右边,先让i与关键数顺序比较,大于挪最右边,换j进行比较,小于挪最左边,再把i指向挪到下一个数,下一个数还是小于关键数就自动再往后移,直到所有数据都排好顺序。

使用方法:

使用到的是   sort(数组名,开始,结尾)函数,在stdlib.h头文件中。
有qsort()   //快速排序
qsort函数,也就是快速排序算法,在C的库中,需加入头文件#include 或#include

调用qsort函数需要写cmp比较函数。
给出按升序排列的例子:

int cmp(const void* a, const void* b)

{   return (int*)a - (int*)b;}

调用:
qsort(a, n, sizeof(int), cmp);  //a为数组,n为个数 


如果需要按照自己的意愿排列,那么同样重写cmp比较函数,就可以完成,和sort函数类似。时间复杂度为O(n log n),但是某些情况要比sort函数好。

例子:

将 n 个正整数作成的一个数列,进行如下操作:每一次删除其中的两个数 a 和 b,然后在数列中加入一个数a×b+1,如此下去直至数列中剩下一个数。

在所有按这种操作方式最后得到的数中,最大的记作 max,最小的记作 min,则该数列的极差定义为M=max-min,请你使用贪心算法设计编程输出他们的极差。

#include 
#include 
/*********  Begin  **********/
int cmpmax(const void* x,const void*y){  //快速排序,从大到小排序
    return *(int *)y-*(int *)x;
}
int cmpmin(const void* x,const void*y){  //快速排序,从小到大排序
    return *(int *)x-*(int *)y;
}
int Min(int b[],int n){                 //求极小
    if(1==n){
        return b[0];
    }
    else{
        qsort(b,n,sizeof(int),cmpmin);  //快速排序法
        int min=b[n-1]*b[n-2]+1;
        b[n-2]=min;
        Min(b,n-1);                //递归
    }
}
int Max(int a[],int n){//求极大
    if(1==n){
        return a[0];
    }
    else{
        qsort(a,n,sizeof(int),cmpmax);//快速排序法
        int max=a[n-1]*a[n-2]+1;
        a[n-2]=max;
        Max(a,n-1);//递归
    }
}
void main()
{
	int i,num;
    scanf("%d",&num);
    int a[num];
    for (i=0;i

更详细的快速排序可以参考链接:(4条消息) 排序——快速排序(Quick sort)_努力的老周的博客-CSDN博客

你可能感兴趣的:(算法设计,排序算法,算法,数据结构)