Partition函数有两种实现方法,单边扫描和双边扫描
Partition函数的作用就是在数组中选择一个数字,接下来把数组的数字分成两个部分,比选择的数字小的移动到数组的左边,比选择的数字大的移动到数组的右边。
单边扫描:首先随机选择一个数字,与数组最后一个元素进行交换,变量i从左到右进行扫描,每一个数都与最后一个元素进行比较,如果比最后一个元素小,扫描变量i的元素与标记变量small的元素进行交换,同时标记变量small++;如果比最后一个元素大,直接进行i++操作。最后交换最后一个元素和标记变量small对应的元素即可
双边扫描:选择第一个元素,作为标记元素,使用两个变量i,j进行扫描,变量i从左边开始扫描,变量j从右边开始扫描。从右边扫描,如果比标记元素大,则继续扫描j--,直到比标记元素小,则将j对应的元素赋值给i对应的元素。从左边扫描,如果比标记元素小,则继续扫描i++,直到比标记元素大,则将i对应的元素赋值给j对应的元素。
代码实现如下:
//单边扫描 int partition(int array[],int start,int end) { if(start>=end) return; int index=RandomInRange(start,end); int indexvalue=array[index]; Swap(&array[index],&array[end]); int small=strat; for(int i=start;i<=end;i++) { if(array[i]<indexvalue) { Swap(&array[i],&array[small]); small++; } } Swap(&array[small],&array[end]); return small; } //双边扫描 int partition(int array[],int start,int end) { int i=start; int j=end; int index=start; if(start>=end) return; while(i<j) { while(i<j && array[index]<=array[j]) j--; if(i<j) array[i++]=array[j]; while(i<j && array[index]>=array[i]) i++; if(i<j) array[j--]=array[i]; }
return i;}Swap(&array[i],&array[index]);