二进制中1的个数
int numberOf1(int num)
{
int i=1;
int count=0;
while(i)
{
if(num&i)
{
count++;
}
i=i<<1;
}
return count;
}
int partition(int* a, int s, int t)
{
while(s<t)
{
while(a[s]<a[t])t--;
swap(a[s],a[t]);
while(a[s]<a[t])s++;
swap(a[s],a[t]);
}
return s;
}
void quicksort(int* a, int s, int t)
{
if(s>=t)return;
swap(a[s],a[s+rand()%(t-s+1)]);
int m=partition(a, s, t);
quicksort(a, s, m-1);
quicksort(a, m+1, t);
}
int theKthNum(int* a, int s, int t, int k)
{
swap(a[s],a[s+rand()%(t-s+1)]);
int m=partition(a, s, t);
if(m-s==k-1) return a[m];
if(m-s>k-1) theKthNum(a, s, m-1, k);
else theKthNum(a, m+1, t, k-(m-s+1));
}
归并排序
void merge_(int* a, int s, int t)
{
int b[5];
int m = (s+t)/2;
int k=s;
int i=s,j=m+1;
for(i,j; i<=m && j<=t;)
{
if(a[i]<a[j])
{
b[k++]=a[i++];
}
else
{
b[k++]=a[j++];
}
}
if(i>m)
{
for(j; j<=t; j++)b[k++]=a[j];
}
if(j>t)
{
for(i; i<=m; i++)b[k++]=a[i];
}
for(int i=s; i<=t; i++)a[i]=b[i];
}
void mergesort(int* a, int s, int t)
{
if(s==t)return;
int m = (s+t)/2;
mergesort(a, s, m);
mergesort(a, m+1,t);
merge_(a, s, t);
}
void heapadjust(int* a, int s, int t)
{
int j=s;
int k = 2*s + 1;
for(int i=k; i<=t; i=2*i+1)
{
if(i<t && a[i]<a[i+1]) i++;
if(a[j]<a[i])
{
swap(a[j],a[i]);
j=i;
}
else break;
}
}
void heapsort(int* a, int t)
{
for(int i=(t-1)/2; i>=0; i--)
heapadjust(a, i, t);
for(int i=t; i>0; i--)
{
swap(a[0], a[i]);
heapadjust(a, 0, i-1);
}
}