ysu_dong

导航

 

最简单的办法,就是先排序,然后把第K个值找出来,这样算法的复杂度为 O(nlgn).

求数组最大,最小(同时)

1.排序,取第一个最后一个。

2 如下,input数量需大于2,

 

    public static void SearchMax_MinValue(int[] input){        
        int maxvalue=input[0];
        int minvalue=input[1];
        if(input[0]<input[1]){
           maxvalue=input[1];
           minvalue=input[0];
        }
        for(int i=2;i<input.length;i=i+2){
                                                //长度为奇数
            if(i==input.length-1)
            {
                if(input[i]>maxvalue){
                    maxvalue=input[i];
                }
                if(input[i]<minvalue){
                    minvalue=input[i];
                }
                break;
            }
            if(input[i]<input[i+1]){
                if(input[i]<minvalue){
                    minvalue=input[i];
                }
                if(input[i+1]>maxvalue){
                    maxvalue=input[i+1];
                }
            }else{
                if(input[i]>maxvalue){
                    maxvalue=input[i];
                }
                if(input[i+1]<minvalue){
                    minvalue=input[i+1];
                }
            }
        }
        System.out.println("MaxValue:"+maxvalue);
        System.out.println("MinValue:"+minvalue);
    }

其实还有一种更简单的方法,其平均复杂度 为 O(lgn),当然,最坏是 O(n^2). 这种算法就是利用了 quicksort 和二分查找 的做法。先把数组分成两个部分,左边一个部分比pivot小,另一边比pivot大。然后再观察pivot的位置,如果pivot的位置比 K大,那么那个第K个值就一定在pivot的左边,同理,第K小的类似。

public void findKthLargest(int left, int right, int[] array, int k) {  

    int tempK = partition(left, right, array);  
    if (tempK == k-1){  
        System.out.println(array[tempK]);  
    } else if (tempK > k-1) {  
        findKthLargest(left, tempK-1, array, k);  
    } else {  
        findKthLargest(tempK+1, right, array, k);  
    }  
}  
  
// partition the array   
public int partition(int left, int right, int[] array) {  
    Random rd = new Random();  
    int pivot = rd.nextInt(right - left + 1) + left ;  
    exchange(pivot, right, array);  
    int startIndex = left;  
    for (int tempIndex = left; tempIndex < right; tempIndex++) {  
        if (array[tempIndex] < array[right]) {  
            exchange(tempIndex, startIndex, array);  
            startIndex++;  
        }   
    }  
    exchange(right, startIndex, array);  
      
    //the index of the pivot   
    return startIndex;  
}  

 

posted on 2012-11-13 14:51  ysu_dx  阅读(284)  评论(0)    收藏  举报