マージソートについてですが, void margeの中の上から3行目のL[i]を出力してみたところ,
入力がn=8,A[i]=8 7 6 5 4 3 2 1にすると, L[i]は8 6 7 8 4 2 3 4 5 6 7 8でした.
A[i]=8 7 6 5 4 3 2 1をマージソートすると,
8 7 6 5 4 3 2 1
7 8 5 6 3 4 1 2
5 6 7 8 1 2 3 4
1 2 3 4 5 6 7 8
となると思ったのですが,このL[i]は何を表しているのですか?
また最後は1234ではなく5678がL[i]に格納されている(?)のはなぜですか.
基本的な質問かもしれませんがよろしくお願いします.
c++
1#include<iostream> 2using namespace std; 3 4#define INFTY 2000000000 5#define MAX 500000 6 7int L[250000+2],R[250000+2]; 8int t=0; 9 10void marge(int A[],int left,int mid,int right){ 11 int n1 = mid - left; 12 int n2 = right - mid; 13 14 for(int i=0;i<n1;i++) L[i] = A[left + i]; //ここです! 15 for(int i=0;i<n2;i++) R[i] = A[mid + i]; 16 17 L[n1]=R[n2]=INFTY; 18 19 int i=0,j=0; 20 for(int k=left;k<right;k++) 21 { 22 t=t+1; 23 if(L[i]<R[j]){ 24 A[k] = L[i]; 25 i = i+1; 26 }else{ 27 A[k] = R[j]; 28 j = j+1; 29 } 30 } 31 32} 33 34void margeSort(int A[],int left,int right){ 35 if(left+1 < right){ 36 int mid = (left+right)/2; 37 margeSort(A,left,mid); 38 margeSort(A,mid,right); 39 marge(A,left,mid,right); 40 } 41} 42 43int main(){ 44 int A[MAX],n; 45 46 cin >> n; 47 for(int i=0;i<n;i++) cin >> A[i]; 48 49 margeSort(A,0,n); 50 51 for(int i=0;i<n;i++){ 52 if(i)cout << " "; 53 cout << A[i]; 54 } 55 cout << endl; 56 cout << t << endl; 57 58 return 0; 59}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/23 00:57