逆序数的求法
来源:互联网 发布:网络空间主权是我国 编辑:程序博客网 时间:2024/04/30 14:03
给定一串数字,求这串数字的逆序数。
- 用两个for循环,O(N^2)的复杂度,最容易考虑到的
- 用归并排序的方式。
利用树状数组,这个方法等到写数状数组的时候再写。
归并排序求逆序数的方法
假如归并时,将a[n]分成a(1,,,mid)和a(mid+1,,, j) 两部分,排序后得到如下的串:
1 3 4 8 9 (前半部分)
2 5 6 7 10 (后半部分)
如果4>2(str1[i]>str2[j]),说明4后面那几个数都比2大,所以此时逆序数就有len1-i+1。
下面是代码:
#include "stdafx.h"#include <iostream>#include <algorithm>#include <cstring>#include "stdio.h"using namespace std;int temp[100]; //存储已排序的数组int ans; //代表逆序数的个数int a[100] = { 1,8,6,3,4,2}; //存储原数组信息void merge(int i, int mid, int j) { int left = i; int right = j; int m = mid + 1; int t = i; //递增temp数组的插入元素位置 while (left <= mid && m <= j) { //两部分数组都没到尽头 if (a[left] > a[m]) { temp[t++] = a[m++]; ans += mid - left + 1; //逆序数计算 } else temp[t++] = a[left++]; } while (left <= mid) { //如果其中一个数组先遍历完了,就添加上剩下的那个数组的剩余元素 temp[t++] = a[left++]; } while (m <= j) { temp[t++] = a[m++]; } for (int k = i; k <= j; k++) { //把数组替换到a数组中 a[k] = temp[k]; }}void mergesort(int i, int j) { if (i < j) { int mid = (j + i) / 2; mergesort(i, mid); mergesort(mid + 1, j); merge(i, mid, j); }}int main() { ans = 0; mergesort(0, 5); printf("%d\n", ans); return 0;}
阅读全文
1 0
- 逆序数的求法
- 逆序数的求法
- 逆序数的几种求法
- 逆序数的几种求法
- 逆序数的几种求法
- 逆序数的几种求法
- 逆序数的几种求法
- 逆序数的几种求法
- 逆序数的几种求法
- 逆序数的三种求法
- 逆序数的几种求法
- 逆序数求法
- 逆序数 归并排序求法
- 逆序对的递归求法
- 数素的求法
- 水仙花数的求法
- 逆序对的求法 归并排序
- 逆序对的求法(树状数组)
- C语言简介
- redis安装和部署(单节点)
- ImportError: No module named caffe 的解决方案
- vim 打开多个文件
- java类加载机制
- 逆序数的求法
- css position
- Android Toolbar 透明化解决方案
- 【总结】嵌入式linux内核中Makefile、Kconfig、.config的关系及增加开机Hello World
- 解决POST数据时因启用Csrf出现的400错误
- java动态代理
- 小程序-swiper-item点击事件
- HTML DOM setTimeout() 方法
- 为什么只能在主线程中操作UI?为什么子线程中setText不报错?