逆序对问题求解,很经典的问题,借助归并排序,可以在NlogN时间内完成 /** * merge函数,iuputArray[beginIndex……midIndex]和iuputArray[midIndex……endIndex] * 是有序的,将他们合并成有序的序列iuputArray[beginIndex……endIndex]即可 */ void merge (int inputArray[], int beginIndex, int midIndex, int endIndex) { int result[endIndex - beginIndex + 1]; int i = beginIndex; int j = midIndex + 1; int k = 0; while (i <= midIndex && j <= endIndex) { if (inputArray [i] <= inputArray [j]) { result[k ++] = inputArray [i ++]; } else { count += midIndex - i + 1; result[k ++] = inputArray [j ++]; } } while (j <= endIndex) result [k ++] = inputArray [j ++]; while (i <= midIndex) result [k ++] = inputArray [i ++]; // for (k = 0; k < endIndex - beginIndex + 1; k ++) // printf("%d ",result[k]); // printf("/n"); //最后一步要赋值,不然result[]是局部变量,当前函数执行完毕,就会销毁变量。 for (k = 0; k < endIndex - beginIndex + 1;k ++) inputArray[beginIndex + k] = result[k]; // returnk result; } /* * 归并排序中调用merge函数 */ void mymergeSort(int a[], int begin, int end) { // static count; if (begin < end) { int mid = (begin + end)/2; mymergeSort (a, begin, mid); mymergeSort (a, mid + 1, end); merge (a, begin, mid, end); } // printf("the number of reverse-order pair is %d", count); }