标签:
划分对于分治的算法设计很重要,下面就专门说一个划分的算法设计,然后再举例子说一些具体的应用。
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