求逆序对数的一种时间复杂度为nlgn的算法
2013-03-05 19:14
381 查看
今天做《算法导论》习题,求解逆序对,更改分治排序法,写出求解逆序对的算法。时间复杂度为nlgn
/************************************************************ * count_inverse.c * * To count the inverse number. * ************************************************************/ #include <stdio.h> #define N 10 int count = 0; void merge_inverse(int numbers[], int p, int q, int r, int *num); void merge_and_count(int numbers[], int p, int r); int main(void) { int numbers , i; printf("Please input %d integers:", N); for (i = 0; i < N; i++) scanf("%d", &numbers[i]); merge_and_count(numbers, 0, N); printf("The count of inverse is: %d\n", count); return 0; } void merge_and_count(int numbers[], int p, int r) { if (p < r) { int q = (p + r) / 2; merge_and_count(numbers, p, q); merge_and_count(numbers, q + 1, r); merge_inverse(numbers, p, q, r, &count); } } void merge_inverse(int numbers[], int p, int q, int r, int *num) { int i, j, k; int l_n = q - p + 1; int r_n = r - q; int Left[l_n], Right[r_n]; for (i = 0; i < l_n; i++) Left[i] = numbers[p + i]; for (i = 0; i < r_n; i++) Right[i] = numbers[q + 1 + i]; for (i = j = 0, k = p; i < l_n || j < r_n; ) { if (i >= l_n) numbers[k++] = Right[j++]; else if(j >= r_n) numbers[k++] = Left[i++]; else if(Left[i] <= Right[j]) numbers[k++] = Left[i++]; else { numbers[k++] = Right[j++]; *num += l_n - i; } } }
相关文章推荐
- 算法初级01——认识时间复杂度、对数器、 master公式计算时间复杂度、小和问题和逆序对问题
- n个无序整数,已知第i个数在排好序的序列中的位置为j,满足|i-j|<=K,请设计一种排序算法,对该序列进行排序。注:算法时间复杂度为O(nlgn)的得0分,复杂度为O(nk) 的得两分,总分是20分
- 计算算法时间复杂度的主方法的一种较为简洁的记忆方法
- O(n*lgn)时间复杂度的逆序对统计算法实现思想
- 计算算法时间复杂度的主方法的一种较为简洁的记忆方法
- 题目2.给出一个算法,它能用O(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目
- 寻找逆序对的算法,要求运行时间为O(nlgn),算法导论答案
- 在nlgn时间内实现逆序对数的计算
- 描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素
- 用“%20”取代字符串中空格的时间复杂度为O(n)的算法
- 算法的时间复杂度
- 找出最大值和最小值的时间复杂度比较小的一种方法
- 算法的时间复杂度和空间复杂度(转)
- 一种最坏情况线性运行时间的选择算法 - The missing worst-case linear-time Select algorithm in CLRS.
- 排序算法分类和算法时间复杂度比较
- 算法的时间复杂度
- 主定理与递归树计算算法时间复杂度
- 恢复博客更新 --- 逆序单项链表 要求空间复杂度o(1) 时间复杂度o(n)
- 常用排序算法的时间和空间复杂度及算法时间复杂度的简单计算
- 算法 时间复杂度 logN 底数