zoukankan      html  css  js  c++  java
  • 给定一整型数组,若数组中某个下标值大的元素值小于某个下标值比它小的元素值,称这是一个反序

    【问题】

    找出反序的个数

    给定一整型数组,若数组中某个下标值大的元素值小于某个下标值比它小的元素值,称这是一个反序。 即:数组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 ", sumNum); printf("%d ", count); free(b); return 0; }

    【执行结果】



  • 相关阅读:
    段落排版--对齐
    1055. The World's Richest (25)
    1054. The Dominant Color (20)
    (八十一)利用系统自带App来实现导航
    (八十)MapKit放置系统默认大头针和自定义大头针
    (七十九)MapKit的基本使用
    1052. Linked List Sorting (25)
    (七十八)使用第三方框架INTULocationManager实现定位
    (七十七)地理编码与反地理编码
    1051. Pop Sequence (25)
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7271959.html
Copyright © 2011-2022 走看看