3.序列划分算法

输入:序列A[p...r].

存在下标q(p<=q<=r),其中A[p...q]中的元素不超过A[r],而A[q+1...r]中的元素均大于A[r].

设置两个下标i,j初始时分别为p-1和p.让j在[p...r]中扫描,若A[j]<=A[r],则将A[j]与A[i+1]交换,然后i增加1.随着j的增加,A[p...i]和A[i+1...j]也会增长,最终j到达r,将A[i+1]与A[r]交换。

算法伪代码:

1.    x<-A[r]

2.    i<-p-1

3.    for j<-p to r-1

4.      do if A[j]<=x

5.        then i<-i+1

6.        exchange A[i]<->A[j]

7.    exchange A[i+1]<->A[r]

8.    return i+1

C++:

#include<iostream>

#include<iterator>

#include<vector>

#include<list>

#include<algorithm>

#include<functional>

using namespace std;

int main(){

int a[]={1,2,5,8,9,0,3,4,6,7},i;

string b[]={"AoMen","BeiJing","ShangHai","ChongQing","TianJin","XiangGang"};

double c[]={0.5,3.7,6.3,8.5,9.2,1.7,2.3,4.1,5.9,7.4};

vector vb=vector(b,b+6);

list lc=list(c,c+10);

i=distance(a,stable_partition(a,a+10,bind2nd(greater_equal(),a[9])));//其中greater是大于,这里数值类的都用greater_equal

//其中的stable_partition是一个STL中的模板函数,意思就是按照第三个参数的规则,将a,a+10内的数据进行划分为[a,a+middle],[a+middle,a+10],并返回middle的下标

//bind2nd(greater_equal(),a[9])是一个定义在functional中的仿函数,意思就是确定划分的标准—按末尾元素a[9]进行划分,前半段部分大于该值greater_equal(),后半段小于该值

copy(a,a+10,ostream_iterator(cout," "));

cout<<endl<<i<<endl;

i=distance(vb.begin(),stable_partition(vb.begin(),vb.end(),bind2nd(less_equal(),*--vb.end())));//less表示小于

copy(vb.begin(),vb.end(),ostream_iterator(cout," "));

cout<<endl<<i<<endl;

i=distance(lc.begin(),stable_partition(lc.begin(),lc.end(),bind2nd(greater_equal(),*--lc.end())));

copy(lc.begin(),lc.end(),ostream_iterator(cout," "));

cout<<endl<<i<<endl;

}

JAVA:

LinearList.java

package test;

import java.util.*;

public class LinearList {

  public static int partition(List a,int p,int r,Comparator comp)//如果要对集合对象或数组对象进行排序,需要实现Comparator接口以达到我们想要的目标。

 {

Comparable x;

  int i,j;

  x=a.get(r);

  i=p-1;

for(j=p;j<r;j++)

if(comp.compare(a.get(j), x)<=0) {//如果不符合规则比较则为-1,符合则为1

i++;

Collections.swap(a, i, j);

}

Collections.swap(a, i+1, r);

return i+1;

  }

}

Greater.java

package test;

import java.util.Comparator;

public class Greater implements Comparator{

public int compare(Comparable x,Comparable y) {

return x.compareTo(y);

}

}

Less.java

package test;

import java.util.Comparator;

public class Less implements Comparator{

public int compare(Comparable x,Comparable y) {

return y.compareTo(x);

}

}

Test.java

package test;

import java.util.*;

public class Test {

public static void main(String[] args) {

Integer a[]= {1,2,5,8,9,0,3,4,6,7},i,j;

String b[]= {"AoMen","Beijing","ShangHai","ChongQing","TianJin","XiangGang"};

Double c[]= {0.5,3.7,6.3,8.5,9.2,1.7,2.3,4.1,5.9,7.4};

ArrayList A=new ArrayList();

for(i=0;i<10;i++)

A.add(a[i]);

Vector B=new Vector();

for(i=0;i<6;i++)

B.add(b[i]);

LinkedList C=new LinkedList();

for(i=0;i<10;i++)

C.add(c[i]);

j=LinearList.partition((List)A, 0, 9, new Greater());

System.out.println(A);

System.out.println(j);

j=LinearList.partition((List)B, 0, 5, new Less());

System.out.println(B);

System.out.println(j);

j=LinearList.partition((List)C, 0, 9, new Greater());

System.out.println(C);

System.out.println(j);

}

}

猜你喜欢

转载自blog.csdn.net/weixin_39653545/article/details/82842353