标签:
划分对于分治的算法设计很重要,下面就专门说一个划分的算法设计,然后再举例子说一些具体的应用。
int Partition(int data[], int start, int end)
{
if(data == NULL)
return -1;
int index = RandomInRange(start, end);
int small = start - 1;
swap(data[index], data[end]);
for(index = start; index < end; index++)
{
if(data[index] < data[end])
{
++small;
if(small != index)
{
swap(data[small], data[index]);
}//if
}//if
}//for
++small;
swap(data[small], data[end]);
return small;
}//Partition()
下面看一下划分的应用。
void QuickSort(int data[], int start, int end)
{
if(start == end)
return;
int index = Partition(data, start, end);
if(index > start)
QuickSort(data, start, index - 1);
if(index < end)
QuickSort(data, index + 1, end);
}
递归的程序一定要有递归出口。
int findKth(int *data, int start, int end, int k)
{
if(start >= end)
return data[end];
int pos = partition(data, start, end);
if(pos + 1 == k)
return data[pos];
else if(pos + 1 > k)
return findKth(data,start, pos -1, k);
else
return findKth(data, pos + 1, end, k);
}
int findKthLargest(int *nums, int numsSize, int k)
{
//转换成求第k小元素
int m = numsSize - k + 1;
int result = findKth(nums, 0, numsSize - 1, m);
return result;
}
标签:
原文地址:http://www.cnblogs.com/stemon/p/4704539.html