2013-04-29 47 views
0

于是找到中间的元素,我有数组是这样的:在数排序阵列

a[1] = 2 
a[4] = 3 
a[8] = 1 

代表这个序列1 1 4 4 4 8

我需要之前找到中间的元素,或元素(奇数和偶数); 在这个例子中它的4.

我该怎么做这个快?

我的代码是非常缓慢:2(找到MID)

static int B(int[] array, int size) {  
    int c = 0; 
    for (int i = 0; i < array.length; i++) { 
     for (int j = 0; j < array[i]; j++) { 
      c++; 
      if (c == size/2) { 
       return i;  
      } 
     } 
    } 
} 
+0

为什么在四舍五入之后不能访问(a.length/2)值? – RelevantUsername 2013-04-29 21:32:17

+0

@BaileyS您的意思是?我将使用这个数组,但我需要找到中间元素 – JohnDow 2013-04-29 21:34:56

+0

@ VladislavIl'ushin向我们展示更清晰的东西。可能是您尝试的一些示例或代码。 – Smit 2013-04-29 21:35:13

回答

5
  1. 导线原阵列,并添加所有值

    a[1] = 2 
    a[4] = 3 
    a[8] = 1 
    sum = 6 
    
  2. 鸿沟和

    mid = 6/2 = 3 
    
  3. 遍历原创a rray和总和

    check if ans <= 0 
    if true print index 
    else continue to next 
    
+0

简单的方法,至多需要O(N)。保持这个速度。 – 2013-04-29 22:11:00

0

减去值对于效率更低的方式来做到这一点,通过运行一个通,并保持更新:)

使用Javascript(因为我是Java的挑战):

var a=[] 

a[1] = 2 
a[4] = 3 
a[8] = 1 
a[9] = 2 
a[10] = 3 
a[11] = 1 
//1 1 4 4 4 8 9 9 10 10 10 11 

function middle (arr){ 
    var stack = [], 
     total = 0, 
     tmp, 
     tmpChange, 
     middle = 0, 
     change = 0, 
     middleElement 

    for (i in arr){ 
    stack.push([i, arr[i]]) 
    total += arr[i] 
    tmp = Math.ceil(total/2) 
    change = tmp - middle 
    middle = tmp 

    while (change){ 
     tmpChange = stack[0][1] - change 

     if (tmpChange >= 0) { 
     stack[0][1] = tmpChange 
     change = 0 
     } 
     else { 
     change -= stack[0][1] 
     stack.splice(0,1) 
     } 
    } 

    middleElement = stack[0][0] 
    } 

    return middleElement 
} 

console.log(middle(a))