定义:
通过一趟排序将要排序的数据分割成两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后按此方法对两部分数据分别进行快速排序,整个快速排序过程可用递归实现。
做法:
设要排序的数组是A[0].....A[n-1],首先任取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数放它前面,所有比它大的数放它后面,这个过程称为一趟快速排序。
野生方法:
让i 指关键数的右边一个,j指数组的最右边,先让i与关键数顺序比较,大于挪最右边,换j进行比较,小于挪最左边,再把i指向挪到下一个数,下一个数还是小于关键数就自动再往后移,直到所有数据都排好顺序。
使用方法:
使用到的是 sort(数组名,开始,结尾)函数,在stdlib.h头文件中。
有qsort() //快速排序
qsort函数,也就是快速排序算法,在C的<stdlib>库中,需加入头文件#include <cstdlib> 或#include <stdlib.h>。
调用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 <stdio.h>
#include <stdlib.h>
/********* 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<num;i++)
scanf("%d",&a[i]);
int b[num];
for(int j=0;j<num;j++){
b[j]=a[j];//复制数组,一个找max,一个找min
}
int max=Max(a,num);
int min=Min(b,num);
printf("Max=max-min=%d-%d=%d",max,min,max-min);
}
/********* End **********/
更详细的快速排序可以参考链接:(4条消息) 排序——快速排序(Quick sort)_努力的老周的博客-CSDN博客