面试题51:数组中的逆序对 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 问题分析 大多数人的第一反应就是顺序扫描整个数组,对每个数字都和后面的数字比较大小,时间复杂度为O(n^2),效率太低。 利用归并排序的 ...
分类:
编程语言 时间:
2020-01-31 20:53:19
阅读次数:
402
归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 分治法: 分割:递归地把当前序列平均分割成两半。 集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)。 ...
分类:
编程语言 时间:
2020-01-31 14:00:22
阅读次数:
75
partition()时间复杂度为O(n),quicksort的划分速度为O(logn),快排的排序时间改进主要取决于递归的深度,也即划分的平均程度,主要受:1.元素重复个数;2.元素的有序程度。元素过多重复时:试想有10000个元素,取值范围为(1,10),在划分时划分后的两段在总体上都会有较大的 ...
分类:
编程语言 时间:
2020-01-30 22:50:34
阅读次数:
78
1 题目 "LeetCode第21题" ,合并两个有序链表. 2 直接合并 因为已经有序了,类似归并排序中的合并一样,操作不难,直接上代码了. 3 递归合并 这个可以采用递归优化,而且不用额外设置一个移动的临时结点t.首先对两个指针进行判空操作,其中一个为空的话返回另一个,然后进行递归合并,首先创建 ...
分类:
其他好文 时间:
2020-01-30 00:04:22
阅读次数:
92
第一种:选择排序 第二种:冒泡排序、改进冒泡排序 第三种:插入排序 第四种:快速排序 第五种:归并排序 #include<iostream> #include<cstring> using namespace std; const int MAXN=1000; int a[MAXN]; int n; ...
分类:
编程语言 时间:
2020-01-29 23:39:35
阅读次数:
72
归并排序的归并这两个字和递归没有关系,归并是将两个有序的数组归并成一个更大的有序数组,但整个排序算法是有可能跟递归有关系的。因为归并排序算法可以按照递归方式去解决,也可以按照迭代方式去解决。 递归方式是自顶向下的归并排序,迭代方式是自底向上的归并排序。这两种归并排序虽然实现方式不同,但是都是调用了核 ...
分类:
编程语言 时间:
2020-01-27 15:43:47
阅读次数:
58
又是链表,怎么又是链表,暴风哭泣了 一看到链表的题我就下意识先去看答案了,先吐槽一会再回去继续写。 仔细看了下,答案中采用了 递归的归并排序方法: 1. Cut步骤: 在顶层将完整的ListNode分成两半, basecase 是 head is None or head.next is None ...
分类:
编程语言 时间:
2020-01-25 20:44:18
阅读次数:
102
首先明白逆序对的定义,逆序对就是数组中两个元素前大后小,我们就称这两个元素为一组逆序对。 接着看题目: 我们利用分治的思想,将区间一分为二,然后得到了逆序对的存在情况共三种: 1.两个元素都在左侧区间。 2.两个元素都在右侧区间。 3.两个元素一个在左,一个在右。 那么很明显我们分治的去解决这个问题 ...
分类:
编程语言 时间:
2020-01-23 22:49:55
阅读次数:
85
归并排序 个人认为归并排序和快速排序有相似之处,都是从大数组一步一步化为小数组再分步解决。 归并排序的思想其实很简单,总共分为两步,分与治。 分指的就是将一个大数组一步一步变小,总体化小再化小,如下图本是长度为8的数组分为两个长度为4的数组再一步一步分下去直到8个数字。 核心代码 int mid=( ...
分类:
编程语言 时间:
2020-01-23 20:01:35
阅读次数:
113