贪心法求数列极差问题

贪心法求数列极差问题

此问题要理解,依次擦掉两个最大的留下的数将会是最小的,反而擦掉两个最小的,最后留下的将是最大的

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个数赋值,然后根据规律找出最大最小的。

在这里插入图片描述

发布了46 篇原创文章 · 获赞 12 · 访问量 1591

猜你喜欢

转载自blog.csdn.net/weixin_43605701/article/details/102610841
今日推荐