求無序陣列中元素出現次數超過陣列長度一半的數字

2021-09-26 07:01:52 字數 1798 閱讀 2686

求無序陣列中元素出現次數超過陣列長度一半的數字.

首先給出幾個"元素出現次數超過陣列長度一半"測試陣列:

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中查詢元素位置的方法複...