使用歸併排序演算法編寫的C/C++程序,用於計算數組中的逆序數
陣列的反轉表示;需要進行多少次變更才能將陣列轉換為其排序形式。當陣列已經排序時,需要 0 次反轉,而在其他情況下,如果陣列反轉,反轉次數將達到最大。
為了解決這個問題,我們將遵循歸併排序方法降低時間複雜度,採用分治演算法。
輸入
A sequence of numbers. (1, 5, 6, 4, 20).
輸出
將數字升序排列所需的反轉次數。
Here the number of inversions are 2. First inversion: (1, 5, 4, 6, 20) Second inversion: (1, 4, 5, 6, 20)
演算法
merge(array, tempArray, left, mid, right)
輸入 - 兩個數組,誰已經合併,左,右和中間索引。
輸出-依排序順序合併的陣列。
Begin i := left, j := mid, k := right count := 0 while i <= mid -1 and j <= right, do if array[i] <= array[j], then tempArray[k] := array[i] increase i and k by 1 else tempArray[k] := array[j] increase j and k by 1 count := count + (mid - i) done while left part of the array has some extra element, do tempArray[k] := array[i] increase i and k by 1 done while right part of the array has some extra element, do tempArray[k] := array[j] increase j and k by 1 done return count End
mergeSort(array, tempArray, left, right)
輸入 - 給定陣列和暫存數組,數組的左右索引。
輸出 - 排序後的逆序對數量。
Begin count := 0 if right > left, then mid := (right + left)/2 count := mergeSort(array, tempArray, left, mid) count := count + mergeSort(array, tempArray, mid+1, right) count := count + merge(array, tempArray, left, mid+1, right) return count End
範例
即時示範
#include <iostream> using namespace std; int merge(int arr[], int temp[], int left, int mid, int right) { int i, j, k; int count = 0; i = left; //i to locate first array location j = mid; //i to locate second array location k = left; //i to locate merged array location while ((i <= mid - 1) && (j <= right)) { if (arr[i] <= arr[j]){ //when left item is less than right item temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; count += (mid - i); //find how many convertion is performed } } while (i <= mid - 1) //if first list has remaining item, add them in the list temp[k++] = arr[i++]; while (j <= right) //if second list has remaining item, add them in the list temp[k++] = arr[j++]; for (i=left; i <= right; i++) arr[i] = temp[i]; //store temp Array to main array return count; } int mergeSort(int arr[], int temp[], int left, int right){ int mid, count = 0; if (right > left) { mid = (right + left)/2; //find mid index of the array count = mergeSort(arr, temp, left, mid); //merge sort left sub array count += mergeSort(arr, temp, mid+1, right); //merge sort right sub array count += merge(arr, temp, left, mid+1, right); //merge two sub arrays } return count; } int arrInversion(int arr[], int n) { int temp[n]; return mergeSort(arr, temp, 0, n - 1); } int main() { int arr[] = {1, 5, 6, 4, 20}; int n = 5; cout << "Number of inversions are "<< arrInversion(arr, n); }
輸出
Number of inversions are 2
以上是使用歸併排序演算法編寫的C/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)

卡塔蘭數是一系列數字。卡塔蘭數是一系列自然數,在各種計數問題中出現,通常涉及遞歸定義的物件。 Cn是長度為2n的Dyck詞的數量。 Dyck字是由n個X和n個Y組成的字串,使得字串的任何初始片段中Y的數量不超過X的數量。例如,以下是長度為6的Dyck詞:XXXYYYXYXXYYXYXYXYXXYYXYXXYXYY.將符號X重新解釋為開括號,將Y解釋為閉括號,Cn計算包含n對正確匹配的括號的表達式的數量((()))( )(())()()()(())()(()())Cn是n+1個因子可以完全括起來的不

數組的反轉表示;需要進行多少次更改才能將數組轉換為其排序形式。當陣列已經排序時,需要0次反轉,而在其他情況下,如果陣列反轉,反轉次數將達到最大。為了解決這個問題,我們將遵循歸併排序方法降低時間複雜度,採用分治演算法。輸入Asequenceofnumbers.(1,5,6,4,20).輸出將數字升序排列所需的反轉次數。 Herethenumberofinversionsare2.Firstinversion:(1,5,4,6,20)Secondinversion:(1,4,5,6,20)演算法merge

php實作並歸排序的方法:1、建立一個PHP範例檔;2、定義「public function handle(){...}」方法;3、透過「private function mergeSort($a, $lo, $hi) {...}」方法將資料逐步分解;4、透過「merge」方法對分解後的資料進行排序,再合併到一起即可。

PHP中的歸併排序演算法詳解引言:排序是電腦科學中常見的基本問題之一,對於資料的有序排列可以提高檢索、查找和修改等操作的效率。在排序演算法中,歸併排序是一種效率較高且穩定的演算法。本文將詳細介紹PHP中的歸併排序演算法,並附帶程式碼範例。歸併排序的原理歸併排序是一種分治演算法,它將待排序的數組分成兩個子數組,分別對這兩個子數組進行歸併排序,然後將已排序的子數組合併成一

如何實現C#中的歸併排序演算法歸併排序是一種基於分治思想的經典排序演算法,其透過將一個大問題劃分為多個小問題、然後逐步解決小問題並合併結果來完成排序。以下將介紹如何在C#中實作歸併排序演算法,並提供具體的程式碼範例。歸併排序的基本概念是將待排序的序列拆分為多個子序列,分別進行排序,然後再將排序好的子序列合併成一個有序的序列。此演算法的關鍵是實現子序列的拆分和合併操作。

這裡我們將看到如何從C或C++程式的原始碼產生預處理或預處理器程式碼。要使用g++編譯器查看預處理程式碼,我們必須使用'-E'選項與g++。預處理器包含程式碼中的所有#指令,並且還擴展了MACRO函數。語法g++-Eprogram.cpp範例#define PI 3.1415int main() { float a = PI,&nb

如何使用Java實現歸併排序演算法引言:歸併排序是一種基於分治法的經典排序演算法,其思想是將待排序的數組逐層劃分為更小的子數組,然後通過合併操作依次將子數組有序地合併成一個有序的整體數組。在本篇文章中,我們將詳細介紹如何使用Java實作歸併排序演算法,並提供具體的程式碼範例。演算法步驟:歸併排序演算法主要包含三個步驟:分割、合併、排序。拆分(Split):首先,我們需要

詳解Java中的歸併排序演算法及其應用一、引言歸併排序是一種經典的排序演算法,它採用分治的思想,將數組分成兩個子數組,然後遞歸地將子數組進行排序,最後將兩個有序的子數組合併成一個有序的數組。本文將詳細解析Java中的歸併排序演算法及其應用,並給出具體的程式碼範例。二、演算法原理歸併排序的主要思想是將一個大數組分成兩個子數組,並分別對兩個子數組進行排序,最後將兩個有序的
