目錄
輸入
輸出
演算法
merge(array, tempArray, left, mid, right)
mergeSort(array, tempArray, left, right)
範例
首頁 後端開發 C++ 使用歸併排序演算法編寫的C/C++程序,用於計算數組中的逆序數

使用歸併排序演算法編寫的C/C++程序,用於計算數組中的逆序數

Aug 25, 2023 pm 07:33 PM
歸併排序 c/c程式 逆序數

使用歸併排序演算法編寫的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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

第n個卡塔蘭數的C/C++程式是什麼? 第n個卡塔蘭數的C/C++程式是什麼? Sep 11, 2023 pm 10:33 PM

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

使用歸併排序演算法編寫的C/C++程序,用於計算數組中的逆序數 使用歸併排序演算法編寫的C/C++程序,用於計算數組中的逆序數 Aug 25, 2023 pm 07:33 PM

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

php怎麼實作並歸排序 php怎麼實作並歸排序 Oct 21, 2022 am 09:30 AM

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

PHP中的歸併排序演算法詳解 PHP中的歸併排序演算法詳解 Jul 08, 2023 pm 05:03 PM

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

如何實作C#中的歸併排序演算法 如何實作C#中的歸併排序演算法 Sep 19, 2023 am 09:45 AM

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

將C/C++程式轉換為預處理器程式碼 將C/C++程式轉換為預處理器程式碼 Sep 11, 2023 pm 04:21 PM

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

如何使用java實作歸併排序演算法 如何使用java實作歸併排序演算法 Sep 19, 2023 am 11:33 AM

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

Java中的歸併排序演算法:原理與實際應用 Java中的歸併排序演算法:原理與實際應用 Feb 18, 2024 pm 03:17 PM

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

See all articles