一
快排 partition 的几种写法。
int Partition1(int arr[], int lhs, int rhs) {
int pivot = arr[rhs];
int i = lhs - 1;
int temp;
for (int j = lhs; j <= rhs-1; ++j)
{
if (arr[j] < pivot)
{ ++i;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
arr[rhs] = arr[i+1];
arr[i+1] = pivot;
return i+1;
}
int Partition2( int R[],int i,int j)
{
int pivot=R[i];
while(i<j){
while(i<j&&R[j]>=pivot)
j--;
if(i<j)
R[i++]=R[j];
while(i<j&&R[i]<=pivot)
i++;
if(i<j)
R[j--]=R[i];
}
R[i]=pivot;
return i;
}
{
int pivot=R[i];
while(i<j){
while(i<j&&R[j]>=pivot)
j--;
if(i<j)
R[i++]=R[j];
while(i<j&&R[i]<=pivot)
i++;
if(i<j)
R[j--]=R[i];
}
R[i]=pivot;
return i;
}
int Partition3(int arr[], int lhs, int rhs) {
int pivot = arr[rhs];
int i = lhs ;
int temp;
for (int j = lhs; j <= rhs-1; ++j)
{
if (arr[j] < pivot)
{
if(i!=j)
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
++i;
}
}
arr[rhs] = arr[i];
arr[i] = pivot;
return i;
}
二 除了用于快排算法。partition还可以用来求最小的k个数,并且时间复杂度为0(n)。
求最小的k个数,一般可直接排序然后输入前k个数,或者利用最小堆输出,但是时间复杂度为0(nlogn)。
下面给出两种最小k个数的算法。
- void quick(int data[], int low, int high ,int k)
- {
- int i = low, j = high, tmp = data[low];
- if (low < high)
- {
- while (i < j)
- {
- while(i < j && data[j] >= tmp)
- {
- j--;
- }
- if(i < j)
- {
- data[i++] = data[j];
- }
- while(i < j && data[i] < tmp)
- {
- i++;
- }
- if(i < j)
- {
- data[j--] = data[i];
- }
- }
- data[i] = tmp;
- if( i == k )
- {
- return;
- }
- quick(data, low, i - 1, k);
- if( i > k )
- {
- return ;
- }
- quick(data, i + 1, high, k);
- }
- }
- int quick2(int data[], int low, int high, int k)
- {
- int index=partition(data,low,high)
- while (index != k-1)
- {
- if(index>(k-1))
- index=partition(data,low,high-1);
else
index=partition(data,low+1,high);}}