/*=================================================================*\ 100-5:查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 \*=================================================================*/
思路:
1》a[n],res[k],遍历a[n]中每个元素a[i],并比较 a[i]与 res[k],如果小则替换,时间复杂度为O(n*k),空间复杂度为 O(k);
2》快排时间复杂度:快排时间复杂度最佳时0(nlogn),最差是O(n2)。
#include <iostream>
using namespace std;
void swap(int &a,int &b){
int tmp=a;
a=b;
b=tmp;
}
void QSort(int *a,int low,int high,int given){
if(low>high){
return;
}
int begin=low;
int end=high;
int key=a[begin];
while(begin < end){
while(key<a[end] && begin<end){
end--;
}
while(key>a[begin] && begin<end){
begin++;
}
swap(a[begin],a[end]);
}
swap(key,a[begin]);
if(given<begin){
QSort(a,low,begin-1,given);
}else if(given>begin){
QSort(a,begin+1,high,given);
}else{
return;
}
}
int main(){
int a[]={6,4,0,16,13,3,9,7,1};
int given=6;
for(int i=0;i<9;i++){
cout<<a[i]<<" ";
}
cout<<endl;
QSort(a,0,8,given);
//cout<<"k:"<<k<<endl;
for(int i=0;i<9;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
为了分析快速排序的时间复杂度,请先看下面的主定理:
主定理: T [n] = aT[n/b] + f (n)
其中 a >= 1 and b > 1 是常量 并且 f (n) 是一个渐近正函数, 为了使用这个主定理,您需要考虑下列三种情况:
快速排序的每一次划分把一个 问题分解成两个子问题,其中的关系可以用下式表示:
T[n] = 2T[n/2] + O(n) 其中O(n)为PARTITION()的时间复杂度,对比主定理,
T [n] = aT[n/b] + f (n)
我们的快速排序中:a = 2, b = 2, f(n) = O(n)那么为什么还有最坏情况呢?
考虑如下极端情况,T[n] = T[n-1] + T[1] + O(n),
问题来了,这一次的划分白玩了,划分之后一边是一个,一边是n-1个,这种极端情况的时间复杂度就是O(n2).