日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

-9 逆序输出一个整数的各位数字_逆序对个数(归并排序)

發布時間:2025/3/11 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 -9 逆序输出一个整数的各位数字_逆序对个数(归并排序) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

輸入 N 組數據,對每組數據輸出逆序對個數。

輸入

對于每組測試用例,第一行輸入此組數據元素個數 x,接下來 x 行,每行一個數,表示元素。(1≤x≤500000)(1≤x≤500000)

當讀入的元素個數 x 為零時,程序結束。

輸出

對于每組測試用例,輸出一個數,表示逆序對個數。

樣例輸入

5 9 1 0 5 4 3 1 2 3 0

樣例輸出

6 0

數據規模與約定

時間限制:1 s

內存限制:256 M

100% 的數據保證 1≤x≤500000

解答:

逆序對定義:設 A 為一個有 n 個數字的有序集 (n>1),其中所有數字各不相同。如果存在正整數 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],則 <A[i], A[j]> 這個有序對稱為 A 的一個逆序對,也稱作逆序數。

根據逆序對定義可知,如果尋找一個序列中逆序對的數量相當于尋找一個序列中每個數后面有多少個小于自己的數,將這些數加起來就是最后的答案。

所以一種暴力的算法就直接出來了,兩層for循環,每次取一個數依次和他后面的數進行比較,如果小于這個數,逆序對數加1否則繼續向后比較。這也是最暴力的算法,時間復雜度O(n)。

上述算法只是為了找到每一個數后面有多少個數小于他自己,,其實可以對其進行排序,然后看每一個數進行了多少次交換。對交換的次數進行統計即可得到最后的結果。排序有好多算法,最好的排序算法是快速排序,但他是不穩定的,并不適合這道題,所以我們選擇一種穩定,并且相對效率較高的歸并排序。下面附上代碼。

#include<iostream> #include<algorithm> using namespace std; #define MAX_N 500000 int n, a[MAX_N +5], temp[MAX_N + 5]; long long num;void merge(int begin, int mid, int end) {int i = begin;int j = mid + 1;int k = begin;while (i <= mid && j <= end){if (a[i] > a[j]) {temp[k] = a[j];k++;j++;num += mid - i + 1; //對交換的次數進行統計} else {temp[k] = a[i];k++;i++;}}while (i <= mid) {temp[k] = a[i];k++;i++;}while (j <= end) {temp[k] = a[j];k++;j++;}for (int p = begin; p <= end; p++)a[p] = temp[p]; }void mergesort(int begin, int end) { //歸并排序if (begin >= end)return;int mid = (begin + end) / 2;mergesort(begin, mid);mergesort(mid + 1, end);merge(begin, mid, end); }int main() {while (1) {cin >> n;if (n == 0) break;for (int i = 0; i < n; i++) cin >> a[i];num = 0;mergesort(0, n - 1);cout << num << endl;} ?return 0; }

以上就是本題的代碼,有什么問題歡迎隨時提問。

總結

以上是生活随笔為你收集整理的-9 逆序输出一个整数的各位数字_逆序对个数(归并排序)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。