172210704111-陈国佳总结《2017年12月13日》【连续063天】
标题:快速排序和分治例题;
内容:
A.快速排序:
排序数组时:1)设k=a[0],将k挪到适当位置,使得比k小的元素都在左边,比k大的元素都在右边;
2)把k左边的部分快速排序;
3)把k右边的部分快速排序;
void swap(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
}
void QuickSort(int a[],int s,int e)
{
if(s>=e) return;
int k=a[s];
int i=s,j=e;
while(i!=j){
while(j>i&&a[j]>=k) --j;
swap(a[i],a[j]);
while(i<j&&a[i]<=k)++i;
swap(a[i],a[j]);
}
QuickSort(a,s,i-1);
QuickSort(a,i+1,e);
}
B.例题:
输出前m大的数:
给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小输出;
一般思路:排序后在输出;
简化思路:把前m大的都弄到数组最右边,在把这m个元素排序输出;
arrangeRight(k):把数组前k大的数弄到最右边:
1)设key=a[0],将key挪到适当位置,其右都大于等于key,其左都小于等于key;
2)数组key前共b个元素,key后(包括key)共a个元素;
a=k done
a>k 对a个元素进行arrangeRight(k);
a<k 对左边b个元素进行arrangeRight(k-a);
明日计划:学习多态实例;