求無序陣列中元素出現次數超過陣列長度一半的數字.
首先給出幾個"元素出現次數超過陣列長度一半"測試陣列:
a1[7]=;不難發現:a2[5]=;
a3[9]=;
陣列中如果乙個數字出現次數超過數字長度的一半.如果把這個陣列排序,那麼排序後的陣列中間的數字一定是出現次數超過數字長度的一半.
如陣列a1長度為7,按從小到大排序後為a1[7]=,此時陣列中間的數字a[7/2]=2就是要找的數字.
如陣列a2長度為5,按從小到大排序後為a2[5]=,此時陣列中間的數字a[5/2]=5就是要找的數字.
如陣列a3長度為9,按從小到大排序後為a3[9]=,此時陣列中間的數字a[9/2]=5就是要找的數字.
所以有了以上的發現,我們就可以先隨機選擇陣列中的乙個數字,然後進行排序,使比它小的數字位於它左邊,使比它大的數字位於它右邊.
如果選中的這個數下標恰好是n/2,那麼這個數字就是陣列的中位數,
如果它的下標大於n/2,那麼它的下標大於n/2,那麼中位數在它的左邊,我們便可以繼續在左邊遞迴查詢,
如果它的下標小於n/2,那麼它的下標小於n/2,那麼中位數在它的右邊,我們便可以繼續在右邊遞迴查詢.
#define _crt_secure_no_warnings 1
#include #include int qort(int arr, int left, int right)
if (arr[right] < tmp)
while (lefttmp)
}return right;
}int selecthalfnum(int *arr,int len)
else
}printf("%d\n", arr[middle]);
}int main()
; int len = sizeof(arr) / sizeof(arr[0]);
selecthalfnum(arr, len);
system("pause");
return 0;
}
以上**有個bug,那就是應該對陣列進行判斷,判斷陣列是否存在出現次數大於陣列長度的元素.
#define _crt_secure_no_warnings 1
#include #include int qort(int arr, int left, int right)
if (arr[right] < tmp)
else
while (lefttmp)
else
}return right;
}int checknum(int *arr, int len, int val)
} if (cout > len/2)
return 0;
}int selecthalfnum(int *arr, int len)
else
}int ret = arr[middle];
if (checknum(arr,len,ret)!=0)
return 0;
}int main()
; int len = sizeof(arr) / sizeof(arr[0]);
printf("%d", selecthalfnum(arr, len));
system("pause");
return 0;
}
C語言 求陣列中元素出現次數超過陣列長度一半的數
原理 設乙個變數儲存當前值。設乙個次數,當前值與下乙個值進行比較。假設相等,次數加一,假設不相等。次數減一。假設次數減到0了還是不相等,就把當前值替換掉。include include include include pragma warning disable 4996 int find half...
無序陣列 刪除出現超過k次的元素
assert 當 i 指i針指向第 i 個元素的時候,保證前 i 1 個元素都是滿足條件的,即,需要保留的。所以 假如前 i 1 個元素中有與第 i 個元素相同的,保留第 i 個元素,否則掃瞄陣列,數數。若出現次數小於k次,將所有和當前元素相等的元素都移到陣列的末尾,當然,和a i 相等的只可能在 ...
排序數列中元素出現次數問題
於 排序數列中元素出現次數問題 這裡採用折半法給出兩種思路 1 找到元素在陣列中的乙個索引位置,由於是陣列是有序排列,所有在這個位置左右移動,就可以找出其所有出現的位置 2 通過折半法找到元素的最大索引位置與最小索引位置,然後兩個索引位置相減再加一,就是元素的出現的次數。方法1中查詢元素位置的方法複...