算法思想:
1.从一个新数列中挑选一个元素称为“基准”pivot。
2.重新排序数列所有元素。比基准值小的摆放在基准元素之前,所有比基准值大的元素摆放在基准之后(相同的数可以摆放到任意一边)。在这个分区退出之后,该基准元素处于数列的中间位置。这个操作叫分区(partition)操作。
3.递归地(recursive)把小于基准元素的子序列和大于基准元素的子序列进行上述操作。
代码:
int parition(int a[],int low,int high){
int pivot=a[low];//选取基准元素
while(low<high){
while(low<high&&a[high]>=pivot) --high;
a[low]=a[high];
while(low<high&&a[low]<=pivot) ++low;
a[hig]=a[low];
}
a[low]=pivot;
return low;
}
void QuickSort(int a[],int low,int high){
if (low<high){
int pivot=parition(a,low,high):
QuickSort(a,low,pivot-1);
QuickSort(a,pivot+1,high);
}
时间复杂度为O(nlogn)~O(n2)。
如何a[]有序时间复杂度为最高,因此对于a[]可以先打散一个。
代码:
int tot=0;全局变量
void rebuild(int a[],int l,int r,int b[]){
if (l==r) return ;
int m=(l+r)/2;
b[tot++]=a[m]:
rebuild(a,l,m);
rebuild(a,m+1,r);
}
练习:
https://www.luogu.com.cn/problem/P1177