部分排序算法:要排序数组中第k1个元素到第k2个元素,先用类快排算法找出第k1和第k2个元素,算法见以前博客:数组中第k个数(《编程珠玑(续)》第3章),此时,k1到k2中的元素虽然未排序,但是任何一个元素都比k1个元素大比k2个元素小。注意如果有相同的元素的特殊情况!然后用快排排序k1到k2之间的元素即可。
#include<iostream>
#include<algorithm>
using namespace std;
int select(int A[],int lo,int hi,int k)
{
while(lo<=hi)
{
int m=lo;
swap(A[lo],A[lo+rand()%(hi-lo+1)]);
for(int i=lo+1;i<=hi;i++)
{
if(A[i]<A[lo])
swap(A[++m],A[i]);
}
swap(A[m],A[lo]);
if(m+1==k)
return A[k-1];
else if(m+1>k)
hi=m-1;
else
lo=m+1;
}
}
int main()
{
const int N=100;
int *A=new int[N];
generate(A,A+N,rand);
select(A,0,N-1,5);
select(A,0,N-1,10);
sort(A+4,A+10);
system("pause");
return 0;
}
到此,两本《编程珠玑》正式结束,时间:2014.11.15,开始时间:2014.10.6,第一本结束时间2014.11.4,第二本开始时间2014.11.5,结束时间2014.11.15.当然第二本还包括了2014.10.15到2014.10.28的中午时间。
接下来就是《编程之美》了,据说不简单,看看再说。哎,时间不多了。。。还想看看linux,不知道有没有时间了。