問題描述:
設A[1..n]是一個包含n個不同數的數組,如果在i <j的情況下,有A[i] >A[j],則(I,j)稱爲A的一個逆序對
利用插入排序和歸併排序實現的代碼如下,其複雜度分別爲各自排序算法複雜度
#include <iostream> using namespace std; typedef int ElementType; int InsertionSort_Inversion(ElementType elems[], int size); int MergeSort_Inversion(ElementType elems[], int begin, int end); int Merge_Inversion(ElementType elems[], int begin, int middle, int end); int main() { int size; //the size of the array cout << "Input the Size of the array:" << endl; cin >> size; int *a = new int[size] (); for (int i = 0; i < size; i++) { cin >> a[i]; } cout << "Before Sort: " << endl; for (int i = 0; i < size; i++) { cout << a[i] << endl; } cout << "Output the number of inversion of the array: " << endl; //cout <<InsertionSort_Inversion(a, size); cout <<MergeSort_Inversion(a, 0, size - 1); cout << "After Sort: " << endl; for (int i = 0; i < size; i++) { cout << a[i] << endl; } delete []a; } /************************************************* Function: InsertionSort_Inversion Description:對elems進行從小到大的排序來計算逆序對數量 Input: elems:ElementType類型的數組 size:elems的大小 Output: 逆序對的數量 *************************************************/ int InsertionSort_Inversion(ElementType elems[], int size) { int inversion = 0; for (int i = 1; i < size; i++) { int j = i - 1; //j表示正在和key比較大小的數組元素的序號 ElementType key = elems[i]; while ( key < elems[j] && j >= 0) { elems[j + 1] = elems[j]; j--; inversion++; } elems[j + 1] = key; } return inversion; } /************************************************* Function: MergeSort_Inversion Description:對elems進行從小到大的排序來計算逆序對數量 Input: elems:ElementType類型的數組 begin:elems的開始序號 end:elems的結束序號 Output: 逆序對的數量 *************************************************/ int MergeSort_Inversion(ElementType elems[], int begin, int end) { int inversion = 0; if (end == begin) { return 0; } else if (end == begin + 1) { if (elems[begin] > elems[end]) { ElementType tempElement = elems[begin]; elems[begin] = elems[end]; elems[end] = tempElement; inversion++; } } else { inversion += MergeSort_Inversion(elems, begin, (begin + end) / 2); inversion += MergeSort_Inversion(elems, (begin + end) / 2 + 1, end); inversion += Merge_Inversion(elems, begin, (begin + end) / 2, end); } return inversion; } /************************************************* Function: Merge_Inversion Description:對elems中begin到middle 和middle到end 兩部分進行從小到大的合併,同時計算逆序對數量 Input: elems:ElementType類型的數組 begin:elems的開始序號 middle:elems的分割序號 end:elems的結束序號 Output: 逆序對的數量 *************************************************/ int Merge_Inversion(ElementType elems[], int begin, int middle, int end) { int inversion = 0; int *tempElems = new int[end - begin + 1] (); int pa = begin; //第一個子數組的開始序號 int pb = middle + 1; //第二個子數組的開始序號 int ptemp = 0; //臨時數組的開始序號 while (pa <= middle && pb <= end) { if (elems[pa] > elems[pb]) { tempElems[ptemp++] = elems[pb++]; inversion += (middle + 1 - pa); } else { tempElems[ptemp++] = elems[pa++]; } } if (pa > middle) { for ( ; pb <= end; pb++) { tempElems[ptemp++] = elems[pb]; } } else if(pb > end) { for ( ; pa <= middle; pa++) { tempElems[ptemp++] = elems[pa]; } } //copy tempElems to lems for (int i = 0; i < end - begin + 1; i++) { elems[begin + i] = tempElems[i]; } delete []tempElems; return inversion; }
在執行MERGE 語句時,一定要確保只更新一條數據 com.microsoft.sqlserver.jdbc.SQLServerException: The MERGE statement attempted to UPDATE or DE
本文分享自華爲雲社區《GaussDB SQL基本語法示例-CASE表達式》,作者:Gauss松鼠會小助手2。 一、前言 SQL是用於訪問和處理數據庫的標準計算機語言。GaussDB支持SQL標準(默認支持SQL2、SQL3和SQL4的主要
前端面試題 - 說一下原型和原型鏈? JavaScript 中,萬物皆對象,對象分爲普通對象和函數對象。 所有的函數都是函數對象(typeof f === 'function'),其他都是普通對象(typeof o === 'object'
唯一索引(Unique Index):保證索引列的值是唯一的,即重複值不允許。 非唯一索引(Non-Unique Index):允許重複值存在。 組合索引(Composite Index):在表的多個列上創建索引。 反向鍵索引(Rever
IPD(集成產品開發)模型的核心價值在於它改變了企業對於產品研發的固有觀點,將企業產研的重點由“技術爲導向”升級爲“用戶需求爲導向”,強調企業在產品的研發過程中堅持以用戶/客戶爲中心。 在IPD(集成產品開發)的模式中,需要企業或者團隊在限
本文介紹了 InnoDB 支持哪幾類表鎖,以及它們分別都用在什麼場景下,還介紹了其中兩類表鎖爲什麼要存在。 作者:操盛春,愛可生技術專家,公衆號『一樹一溪』作者,專注於研究 MySQL 和 OceanBase 源碼。 愛可生開源社區出品,
原方法 /** * 動態更新form * @param form */ updateForm(form) { this.form.manholeId = form.manholeId; this.form
詳解 binlog 時間戳與 exec_time 的關係。 作者:李錫超,蘇商銀行DBA,負責數據庫和中間件運維和建設。擅長 MySQL、Python、Oracle,愛好騎行、技術研究和分享。 愛可生開源社區出品,原創內容未經授權不得隨意
背景 最近領導分配了個任務,測試sit環境一些功能相比之前慢了許多,需要優化一下。 問題排查過程 瀏覽器F12查看相關接口的響應,看到底是哪個接口反應慢,根據互聯網的要求,頁面3秒還沒有顯示出來,用戶體驗會非常差。 查看相關代碼的提交
本文分享自華爲雲社區《GaussDB SQL基礎語法示例-BOOLEAN表達式》,作者:Gauss松鼠會小助手2。 一、前言 SQL是用於訪問和處理數據庫的標準計算機語言。GaussDB支持的SQL標準(默認支持SQL2、SQL3和SQL
O2OA(翱途)開發平臺[下稱O2OA開發平臺或者O2OA]的消息機制允許開發者通過配置實現郵件通知。本篇主要闡述如何實現待辦消息的郵件通知。 一、先決條件: 1、O2Server服務器正常運行,系統安裝部署請參考
Flowable 有3種監聽器,相關內容在開發文檔中有詳細的說明: 事件監聽器(Flowable 開發文檔 3.18) 執行監聽器(Flowable 開發文檔 8.5.13) 任務監聽器(Flowable 開發文檔 8.5.14) 分別
本文分享自華爲雲社區《GaussDB(DWS)向量化執行引擎詳解》,作者: yd_212508532。 前言 適用版本:【基線功能】 傳統的行執行引擎大多采用一次一元組的執行模式,這樣在執行過程中CPU大部分時間並沒有用來處理數據,更
剛剛進行了微信sessionkey的學習,正準備實戰一下,就發現了這個神奇的網站,預知後事如何。請繼續向下看去 1. 目標 2. 開局一個登錄框 3. 首先,直接弱口令走起來,萬一留有測試的賬號呢 嘗試,1311111111,1333
隨着當前數據處理業務場景日趨複雜,對於大數據處理平臺基礎架構的能力要求也越來越高,既要求數據湖的大存儲能力,也要求具備海量數據高效批處理能力,同時還可能對延時敏感的近實時鏈路有強需求,本文主要介紹基於 MaxCompute 的離線近實時一體