首页 > 代码库 > 给定一整型数组,若数组中某个下标值大的元素值小于某个下标值比它小的元素值,称这是一个反序
给定一整型数组,若数组中某个下标值大的元素值小于某个下标值比它小的元素值,称这是一个反序
【问题】
找出反序的个数
给定一整型数组,若数组中某个下标值大的元素值小于某个下标值比它小的元素值,称这是一个反序。 即:数组a[]; 对于i < j 且 a[i] > a[j],则称这是一个反序。 给定一个数组,要求写一个函数,计算出这个数组里所有反序的个数。
【代码】#include <stdio.h> #include <stdlib.h> #include <string.h> int sumNum = 0; void merge(int *a, int *b, int begin, int mid, int end) { int i, j, k = 0; i = begin; j = mid + 1; while (i <= mid && j <= end) { if (a[i] < a[j]) b[k++] = a[i++]; else { b[k++] = a[j++]; sumNum += mid - i + 1;//计算反序对 } } while (i <= mid) b[k++] = a[i++]; while (j <= end) b[k++] = a[j++]; for (i = 0; i < k; i ++) a[i + begin] = b[i]; } void mergeSort(int *a, int *b, int begin, int end)//归并排序,时间复杂度O(n*lgn)。 { int mid = (begin + end) / 2; if (begin < end) { mergeSort(a, b, begin, mid); mergeSort(a, b, mid + 1, end); merge(a, b, begin, mid, end); } } int countReverse(int *a, int len) //遍历查找反序,时间复杂度O(n^2)。 { int count = 0; int i, j; for (i = 0; i < len - 1; i ++) for (j = i + 1; j < len; j++) if(a[i] > a[j]) count++; return count; } int main(void) { int count; int a[] = {7, 4, 5, 3, 8, 6, 9, 10, 11}; int len = sizeof(a) / sizeof(int); int *b; b = (int *)malloc(len * sizeof(int)); count = countReverse(a, len); mergeSort(a, b, 0, len - 1); printf("%d\n", sumNum); printf("%d\n", count); free(b); return 0; }【运行结果】
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。