缺氧遊戲14人基地佈局分享(萌新版)
阿新 • • 發佈:2022-04-02
歸併排序
1.概念
歸併排序(Merge sort)是建立在歸併操作上的一種有效的排序演算法,歸併排序對序列的元素進行逐層折半分組,然後從最小分組開始比較排序,合併成一個大的分組,逐層進行,最終所有的元素都是有序的
2.原理
例如我們將4、5、8、7、2、6、3進行排序
首先我們需要劃分區間,這一步驟我們用遞迴來實現。
再將每一個小的序列按照從小到大的順序進行排序存入一個新的陣列當中,最後再把元素賦給原陣列。
3.程式碼
int tmp[1000], a[1000]; void merge_sort(int a[], int l, int r) { int mid = l + r >> 1; merge_sort(a, l, mid); merge_sort(a, mid + 1, r); int k = 0, i = l, r = mid + 1; while(i <= mid && j <= r) { if(a[i] <= a[j])tmp[k++] = a[i++]; else tmp[k++] = a[j++]; } while(i <= mid) tmp[k++] = a[i++];//這裡防止某個區間有剩餘元素 while(j <= r) tmp[k++] = a[j++]; for(i = 0, j = l; j <= r; i++, j++)//把排好序的數賦給原陣列 a[j] = tmp[i]; }
4.歸併排序求逆序數
int tmp[1000], a[1000]; long long res; long long merge_sort(int a[], int l, int r) { int mid = l + r >> 1; res += merge_sort(a, l, mid) + merge_sort(a, mid + 1, r); int k = 0, i = l, r = mid + 1; while(i <= mid && j <= r) { if(a[i] <= a[j])tmp[k++] = a[i++]; else { res += mid - i + 1;//a[i]的數全部大於a[j] tmp[k++] = a[j++]; } } while(i <= mid) tmp[k++] = a[i++];//這裡防止某個區間有剩餘元素 while(j <= r) tmp[k++] = a[j++]; for(i = 0, j = l; j <= r; i++, j++)//把排好序的數賦給原陣列 a[j] = tmp[i]; return res; }