package com.java.ly2011.July;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 从某个数组中找出 和为指定整数的 元素对
* @author ly
*
*/
public class CertainValueFromPair {
public static void main(String[] args) {
int[] a = new int[]{0,9,15,7,13,8,2,1,4,5};
quickSort(a, 0, a.length-1);
System.out.println(Arrays.toString(a));
List<String> list = getPare(a, 7);
System.out.println(list);
}
/**
* 从a数组中找到两个元素,让其和等于targetValue
* 找到所有的这样的对
* @param a
* @param targetValue
* @return int1:int2 为元素的list的集合
*/
public static List<String> getPare(int[] a,int targetValue){
quickSort(a, 0, a.length-1);
List<String> resultlList = new ArrayList<String>();
int start = 0;
int end = a.length-1;
while(start<end){
if(a[start]+a[end]==targetValue){
resultlList.add(a[start]+":"+a[end]);
start++;
end--;
}
else if(a[start]+a[end]>targetValue){
end--;
}
else{
start++;
}
}
return resultlList;
}
/**
* 快速排序主程序 升序排序 p为0,q为n-1则排数组全部
* @param p 起始位置p 0
* @param q 终止位置q n-1
* @param A 待排序数组A
*/
private static void quickSort(int[] A,int begin,int end){
if(begin>=end){
return;
}else{
int part=partition(A,begin, end);//能进入partition的都满足begin<end这个条件
quickSort(A, begin, part-1);
quickSort(A, part+1, end);
}
}
/**
* 被划分的数组时A[m,p-1]
* @param m 起始位置
* @param p 终止位置
* @param A 数组A
* 返回 交换的位置
*/
private static int partition(int[] A,int m,int p){
int leftbound = m+1;
int rightbound = p;
int begin=leftbound;
int end=rightbound;
int v=A[m];
while(begin<end){
//判断界限写在前面,这样如果越界就会短路,不执行后面的A[begin]及A[end]了,以防止数组越界抛出outofbound异常
for( ; begin<=rightbound && A[begin]<=v ; begin++);
for( ; end>=leftbound && A[end]>v ; end--);
if(begin<end) {
int temp=A[begin];
A[begin]=A[end];
A[end]=temp;
}
}
//交换A[m](划分的标准数) 及 A[end]
A[m]=A[end];
A[end]=v;
return end;
}
}