贪心法求数列极差问题
此问题要理解,依次擦掉两个最大的留下的数将会是最小的,反而擦掉两个最小的,最后留下的将是最大的
package queueMSMI;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class queue {
@SuppressWarnings("unchecked")
public static void main(String [] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
Scanner input =new Scanner(System.in);
System.out.print("输出数组大小N=");
int N=input.nextInt();
for(int i=0;i<N;i++) {//用random给N个数赋值
list.add(new Random().nextInt(10));
}
System.out.println(list);
quickSort.Sort(list);
System.out.println(list);
int min=list.get(list.size()-1);
int max1=list.get(0);
for(int i=list.size()-1;i>0;i--) {
min=(list.get(i-1)*min)+1;
}
System.out.println("按照这种操作下去,最后且最小的数为"+min);
int i=1;
int max=0;
while(i<N)//寻找最小,执行公式,N个数需要N-1次
{
//想法是每次将两个数乘积加一赋值给第一个数,然后将第二个数移除,循环N-1
//次之后,第一个数即为最大值
quickSort.Sort(list);
list.set(0, list.get(1)*list.get(0)+1);
list.remove(1);
i+=1;
}
max=list.get(0);
System.out.println("按照这种操作下去,最后且最大的数为"+max);
System.out.println("该数列的极差为: "+(max-min));
}
}
快速排序算法:
package queueMSMI;
import java.util.ArrayList;
public class quickSort {
public static int Partition(ArrayList<Integer> list,int left,int right) {
int pivot=list.get(left);//先定义区间数组第一个元素为主元
int i=left; //定义最低的索引low是first+1。比主元大一位
int j=right; //定义最高的索引high是last
while(i!=j){ //当low小于high的位置时,执行以下循环
while(list.get(j)>pivot&&i<j){//当high的索引上的值比主元大时,且索引大于low时
j--; //寻找比主元小的值的位置索引
}
while(list.get(i)<=pivot&&i<j){//当low的索引上的值比主元小时,索引小于high时
i++; //寻找比主元大的值的位置索引。
}
if(i<j){ //交换low和high的值
int t=list.get(i);
list.set(i,list.get(j));
list.set(j,t);
}
}
// list[left]=list.get(j);
list.set(left,list.get(j));
// list[j]=pivot;
list.set(j,pivot);
return j;
}
public static void QuickSort(ArrayList<Integer> list,int first,int end) {
if(first<end) {
int pivor=Partition(list,first,end);
QuickSort(list,first,pivor-1);
QuickSort(list,pivor+1,end);
}
}
public static void Sort(ArrayList<Integer> list) {
QuickSort(list,0,list.size()-1);
}
}
键盘输入数列n的规模,用random函数产生随机数给n个数赋值,然后根据规律找出最大最小的。