1. 程式人生 > >給定一整型數組,若數組中某個下標值大的元素值小於某個下標值比它小的元素值,稱這是一個反序

給定一整型數組,若數組中某個下標值大的元素值小於某個下標值比它小的元素值,稱這是一個反序

merge ont -m cpp tracking 全部 執行 clas lib

【問題】

找出反序的個數

給定一整型數組,若數組中某個下標值大的元素值小於某個下標值比它小的元素值,稱這是一個反序。 即:數組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; }

【執行結果】

技術分享

給定一整型數組,若數組中某個下標值大的元素值小於某個下標值比它小的元素值,稱這是一個反序