C++程式以尋找數組中第二大的元素
陣列的目的是將相似類型的資料儲存在一系列可以使用基底位址和索引存取的記憶體位置中。我們在許多不同的應用程式中使用陣列來保存用於各種目的的資料。找到最小和最大元素是數組的一個相當常見的範例,在包括排序等在內的多個應用程式中都需要數組。在本文中,我們將了解如何在 C 中從陣列中找到第二大元素。
透過範例理解概念
Given array A = [89, 12, 32, 74, 14, 69, 45, 12, 99, 85, 63, 32] The second largest element is 89
在上面的範例中,陣列中有 12 個元素。數組中最大的元素是99,第二大的元素是89。在第一種方法中要找到第二大的元素,我們只需將元素按升序或降序排序,然後直接返回倒數第二個或第二個元素以獲得第二大元素。演算法如下 -
演算法
取大小為n的陣列A
根據陣列 A 的值的非遞增順序對陣列 A 進行排序
傳回 A[ 1 ] // 因為第 0 個索引包含最大元素
#範例
#include <iostream> #include <algorithm> # define Z 30 using namespace std; void displayArr(int arr[], int n ) { for( int i = 0; i < n; i++ ){ cout << arr[ i ] << ", "; } cout << endl; } int getSecondLargest( int A[], int n ){ sort( A, A + n, greater<int>() ); return A[ 1 ]; } int main() { int arr[ Z ] = {84, 56, 21, 32, 74, 96, 85, 41, 21, 94, 20, 37, 36, 75, 20}; int n = 15; cout << "Given array elements: "; displayArr( arr, n); cout << "The second largest element: " << getSecondLargest( arr, n ); }
輸出
Given array elements: 84, 56, 21, 32, 74, 96, 85, 41, 21, 94, 20, 37, 36, 75, 20, The second largest element: 94
使用雙重遍歷
上面的方法看起來很簡單,但是這個過程對於這個問題來說效率不高。由於我們使用排序,因此執行排序至少需要 O(n.log n) 時間。但我們也可以在線性時間內解決這個問題。在目前的方法中,我們兩次遍歷元素數組並找到第二大元素。讓我們檢查一下演算法。
演算法
取大小為n的陣列A
最大 := -無窮大
秒最大 := -無窮大
對於 A 中的每個元素 e,執行
如果 e 大於 Maximum,則
最大= e
#結束如果
結束
#對於 A 中的每個元素 e,執行
如果e大於secLargest但小於maximum,則
秒最大= e
#結束如果
結束
#傳回秒最大
#範例
#include <iostream> #include <algorithm> # define Z 30 using namespace std; void displayArr(int arr[], int n ) { for( int i = 0; i < n; i++ ){ cout << arr[ i ] << ", "; } cout << endl; } int getSecondLargest( int A[], int n ){ int largest = -99999; for( int i = 0; i < n; i++ ) { if( A[i] > largest ){ largest = A [ i ]; } } int secLargest = -99999; for( int i = 0; i < n; i++ ) { if( A[i] > secLargest && A[i] < largest ){ secLargest = A [ i ]; } } return secLargest; } int main() { int arr[ Z ] = {84, 56, 21, 32, 74, 96, 85, 41, 21, 94, 20, 37, 36, 75, 20}; int n = 15; cout << "Given array elements: "; displayArr( arr, n); cout << "The second largest element: " << getSecondLargest( arr, n ); }
輸出
Given array elements: 84, 56, 21, 32, 74, 96, 85, 41, 21, 94, 20, 37, 36, 75, 20, The second largest element: 94
使用單次遍歷
上面的解決方案遍歷了陣列兩次。在第一次運行中,從數組中找到最大的元素,然後在第二次運行中,搜尋最大但不大於第一個最大的元素。由於陣列是線性資料結構,每次遍歷都需要 O(n) 時間,因此最終求解的時間為 O(2n),也是線性的,與 O(n) 類似。但這不是一個有效的解決方案,我們只能透過一次遍歷來解決這個問題。讓我們看看它的演算法。
演算法
取大小為n的陣列A
最大 := A[0]
對於從 1 到 n - 1 的起始索引,執行
如果目前元素A[ i ]大於maximum,則
秒最大 := 最大
最大 := A[ i ]
否則當 A[ i ] 介於largest 和 secLargest 之間時,則
秒最大 := A[ i ]
結束如果
結束
#傳回秒最大
#範例
#include <iostream> #include <algorithm> # define Z 30 using namespace std; void displayArr(int arr[], int n ) { for( int i = 0; i < n; i++ ){ cout << arr[ i ] << ", "; } cout << endl; } int getSecondLargest( int A[], int n ){ int largest = A[ 0 ]; int secLargest = -9999; for( int i = 1; i < n; i++ ) { if( A[i] > largest ){ secLargest = largest; largest = A[ i ]; } else if( secLargest < A[ i ] && A[ i ] != largest ) { secLargest = A[ i ]; } } return secLargest; } int main() { int arr[ Z ] = {84, 56, 21, 32, 74, 96, 85, 41, 21, 94, 20, 37, 36, 75, 20}; int n = 15; cout << "Given array elements: "; displayArr( arr, n); cout << "The second largest element: " << getSecondLargest( arr, n ); }
輸出
Given array elements: 84, 56, 21, 32, 74, 96, 85, 41, 21, 94, 20, 37, 36, 75, 20, The second largest element: 94
結論
在本文中,我們了解了從給定數組中尋找第二大元素的三種不同方法。第一種方法是使用排序。然而,這個解決方案效率不高,並且至少需要 O(n log n ) 時間。後一種解決方案非常有效,因為它們需要線性時間。第二種解決方案是在陣列上使用雙重遍歷,也可以透過單一遍歷進行最佳化,如第三種解決方案所示。
以上是C++程式以尋找數組中第二大的元素的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

使用foreach循環移除PHP數組中重複元素的方法如下:遍歷數組,若元素已存在且當前位置不是第一個出現的位置,則刪除它。舉例而言,若資料庫查詢結果有重複記錄,可使用此方法移除,得到不含重複記錄的結果。

PHP中深度複製數組的方法包括:使用json_decode和json_encode進行JSON編碼和解碼。使用array_map和clone進行深度複製鍵和值的副本。使用serialize和unserialize進行序列化和反序列化。

PHP數組鍵值翻轉方法效能比較顯示:array_flip()函數在大型數組(超過100萬個元素)下比for迴圈效能更優,耗時更短。手動翻轉鍵值的for迴圈方法耗時相對較長。

多維數組排序可分為單列排序和嵌套排序。單列排序可使用array_multisort()函數依列排序;巢狀排序需要遞歸函數遍歷陣列並排序。實戰案例包括按產品名稱排序和按銷售量和價格複合排序。

在PHP中執行陣列深度複製的最佳實踐是:使用json_decode(json_encode($arr))將陣列轉換為JSON字串,然後再轉換回陣列。使用unserialize(serialize($arr))將陣列序列化為字串,然後將其反序列化為新陣列。使用RecursiveIteratorIterator迭代器對多維數組進行遞歸遍歷。

PHP的array_group_by函數可依鍵或閉包函數將陣列中的元素分組,傳回關聯數組,其中鍵為組名,值是屬於該組的元素數組。

PHP是一種常用的伺服器端腳本語言,廣泛應用於網站開發和資料處理領域。在PHP中,將陣列中的值進行大小排序是很常見的需求。透過使用內建的排序函數,可以很方便地實現對數組的排序操作。以下將介紹如何使用PHP對陣列中的值進行大小排序,並附上具體的程式碼範例:1.將陣列中的值升序排序:

PHP的array_group()函數可用來按指定鍵對陣列進行分組,以尋找重複元素。函數透過以下步驟運作:使用key_callback指定分組鍵。可選地使用value_callback確定分組值。對分組元素進行計數並識別重複項。因此,array_group()函數對於尋找和處理重複元素非常有用。
