3402 資料結構實驗之排序五 歸併求逆序數

2021-09-10 13:08:21 字數 1486 閱讀 5131

time limit: 50 ms memory limit: 65536 kib

submit

statistic

discuss

problem description

對於數列a1,a2,a3…中的任意兩個數ai,aj (i < j),如果ai > aj,那麼我們就說這兩個數構成了乙個逆序對;在乙個數列中逆序對的總數稱之為逆序數,如數列 1 6 3 7 2 4 9中,(6,4)是乙個逆序對,同樣還有(3,2),(7,4),(6,2),(6,3)等等,你的任務是對給定的數列求出數列的逆序數。

input

輸入資料n(n <= 100000)表示數列中元素的個數,隨後輸入n個正整數,數字間以空格間隔。

output

輸出逆序數。

sample input

10

10 9 8 7 6 5 4 3 2 1

sample output

45
hint

source

xam一開始寫這個題的時候想法便是將無序數列排序成有序的數列,通過記錄每個數字的初始下標和最終下標,既然給出的要求是必須下標越大的關鍵值就要越大,通過初始下標與正確下標的差值能不能計算出逆序數的結果,但沒有給出乙個可行的做法。按照題目的要求,歸併求逆序數,就先寫了一整個歸併排序。再後面看了部落格才知道歸併排序具體地應該怎麼使用以及每一步的含義。

在這個題裡,要求的是數字下標越大,對應的數字越大,即要求將陣列中的數字由小到大排序。先按由小到大排序寫好歸併排序。根據歸併排序的性質,要求的是兩個子串行放置乙個新的序列中,而這兩個子串行又分別是有序的,在這即是由小到大排列的。假設這樣的情形:序列1在序列2之前,而序列12中的全體元素均需要放至序列temp中。序列12的元素均是由小到大排的有序排列。正常情形下,序列1的最後乙個(最大元素)元素應該是小於序列2的第乙個(最小元素)元素,但出現了序列2中的數小於序列1的情況時,逆序就出現了,假設序列1的a[i]加入了temp,而本應是a[i+1]繼續加入卻被序列2的a[j]所替代,則表示由a[i]到a[m](序列1中的最後乙個元素)均大於a[j]。這時的逆序數需要加上m-i+1.

**如下:

#include using namespace std;

int a[100000];

int temp[100000];

long long int count=0;

void merge_1(int first,int mid,int last,int a,int temp)

else if(a[i]>a[j])

}while(i<=m)

while(j<=n)

for(int i=0; i>n;

for(int i=0; i>a[i];

}mergesort(0,n-1);

cout《寫完程式後還有地方沒能過:1.超時,新增了兩個語句即完成是scanf與cin的區別 2.錯誤,在於count設定的不夠大,設為long long int 型別可以避免

SDUT3402資料結構實驗之排序五 歸併求逆序數

time limit 20ms memory limit 65536k 對於數列a1,a2,a3 中的任意兩個數ai,aj i j 如果ai aj,那麼我們就說這兩個數構成了乙個逆序對 在乙個數列中逆序對的總數稱之為逆序數,如數列 1 6 3 7 2 4 9中,6,4 是乙個逆序對,同樣還有 3,2...

資料結構Vector之選擇排序 氣泡排序 歸併排序

在前面介紹完vector向量類的實現後,在此處簡要介紹三個排序演算法的實現,其中包括 以及圖示例。1 下面首先介紹選擇排序。選擇排序是選定首端或者末端作為遍歷開端,此處假定選定末端。在一次從後往前遍歷的過程中,在指標指向元素的前方,選出其中最大的乙個值,與指標指向的元素交換。每一次交換都保證最大值排...

資料結構 實驗五

實驗五查詢和排序的應用 一 實驗目的 1 本實驗可以使學生更進一步鞏固各種查詢和排序的基本知識。2 學會比較各種排序與查詢演算法的優劣。3 學會針對所給問題選用最適合的演算法。4 掌握利用常用的排序與選擇演算法的思想來解決一般問題的方法和技巧。二 實驗內容 問題描述 學生資訊管理系統 基本要求 設計...