由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 请大家帮忙分析一下这个程序的时间复杂性
相关主题
MS那个扫正数和负数的题目偏难fibonacci 复杂度这么简单推一下对不对?
再来讨论一个题!求个递归复杂度答案
Microsoft 校园面试面经 + Onsite 求 Bless想问下 Word Break II 这道题
讨论一道老题:分离数组中的正负数 (转载)这道题要用什么数据结构?
这道题太神奇了,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),说说4sum的复杂度吧
从水木上看到个数组题给定一个数组,找出3个数乘积最大。
请大牛解释一下leetcode新题问个MS 老问题
复杂度是O(n),英语怎么说?一个精华区的算法题
相关话题的讨论汇总
话题: input话题: int话题: temp话题: 扫到话题: 正数
进入JobHunting版参与讨论
1 (共1页)
j**l
发帖数: 2911
1
这道题就是那道被讨论得热火朝天的MS老题,如何把负数扫到左边,正数扫到右边。对
所有的正数和所有的负数,都不能改变原有的相对次序
/*
{1, 5, -5, -8, 2, -1, 15}
要把负的扫到左边,正的扫到右边。
不能改变顺序
得到{-5 -8 -1 1 5 2 15}
*/
void swap_numbers(int input[], int n)
{
int temp;
for (int i = 0; i < n; )
{
if (input[i] > 0 && i < n - 1 && input[i + 1] < 0)
{
temp = input[i];
input[i] = input[i+1];
input[i+1] = temp;
if (i > 0 && input[i-1] > 0)
i--;
else
i++;
g*******y
发帖数: 1930
2
平方级的
j**l
发帖数: 2911
3
如何给出证明?

【在 g*******y 的大作中提到】
: 平方级的
j**l
发帖数: 2911
4
这个程序算简洁么? 面试官事后会因为O(n^2)而提交negative的feedback么?

【在 g*******y 的大作中提到】
: 平方级的
o**********t
发帖数: 406
5
直接看程序,有时很难一眼看出复杂度。
关键是在纸上的分析,如果一个算法在纸上分析不出 O(N),程序在怎么写,能写出 O
(N) 来?

【在 j**l 的大作中提到】
: 这道题就是那道被讨论得热火朝天的MS老题,如何把负数扫到左边,正数扫到右边。对
: 所有的正数和所有的负数,都不能改变原有的相对次序
: /*
: {1, 5, -5, -8, 2, -1, 15}
: 要把负的扫到左边,正的扫到右边。
: 不能改变顺序
: 得到{-5 -8 -1 1 5 2 15}
: */
: void swap_numbers(int input[], int n)
: {

j**l
发帖数: 2911
6
有谁能总结一下,这道题目前公认最好最优的算法是什么?空间复杂度必须是O(1)

O

【在 o**********t 的大作中提到】
: 直接看程序,有时很难一眼看出复杂度。
: 关键是在纸上的分析,如果一个算法在纸上分析不出 O(N),程序在怎么写,能写出 O
: (N) 来?

s*********g
发帖数: 153
7
这个循环,长度虽然是n,但是时间复杂度不是 O(n),因为不停的有 i--,所以swap
的次数不是O(n),虽然没写出来,但我感觉,里面就像有嵌套了一个循环的效果,唉
,我也不太会证明....

【在 j**l 的大作中提到】
: 这道题就是那道被讨论得热火朝天的MS老题,如何把负数扫到左边,正数扫到右边。对
: 所有的正数和所有的负数,都不能改变原有的相对次序
: /*
: {1, 5, -5, -8, 2, -1, 15}
: 要把负的扫到左边,正的扫到右边。
: 不能改变顺序
: 得到{-5 -8 -1 1 5 2 15}
: */
: void swap_numbers(int input[], int n)
: {

g*******y
发帖数: 1930
8
假设一共有n+1个数, 假设对于前n个数,已经做完了,得到
y**i
发帖数: 1112
9
这个程序跟我在另一个帖子里给出的程序执行方法几乎一摸一样,思路就是把每个负数
冒泡法一样的交换到它前面的所有正数的前面,与其用冒泡法还不如用插入法呢,我修
改了一下就是:
void SplitPN(int A[], int p, int r)
{
int i = p-1, j, k, temp;
for (j = p; j <= r; ++j)
{
if (A[j] < 0)
{
++i;
temp = A[j];
for (k = j; k > i; --k)
{
A[k] = A[k-1];
}
A[i] = temp;
}
}
}

【在 j**l 的大作中提到】
: 这道题就是那道被讨论得热火朝天的MS老题,如何把负数扫到左边,正数扫到右边。对
: 所有的正数和所有的负数,都不能改变原有的相对次序
: /*
: {1, 5, -5, -8, 2, -1, 15}
: 要把负的扫到左边,正的扫到右边。
: 不能改变顺序
: 得到{-5 -8 -1 1 5 2 15}
: */
: void swap_numbers(int input[], int n)
: {

y**i
发帖数: 1112
10
时间复杂度最坏情况是O(n^2/2)=O(n^2)

【在 y**i 的大作中提到】
: 这个程序跟我在另一个帖子里给出的程序执行方法几乎一摸一样,思路就是把每个负数
: 冒泡法一样的交换到它前面的所有正数的前面,与其用冒泡法还不如用插入法呢,我修
: 改了一下就是:
: void SplitPN(int A[], int p, int r)
: {
: int i = p-1, j, k, temp;
: for (j = p; j <= r; ++j)
: {
: if (A[j] < 0)
: {

a*******h
发帖数: 123
11
你这个是 O(n^2) 比较显然吧,每次把一个负数往前顺至多需要 O(n) 步。
再考虑左边一半全是正数右边一半全是负数的输入,你的程序需要运行 n^2 步,所以复
杂度也是 \Omega(n^2)。
所以一共就是 \Theta(n^2)。

【在 j**l 的大作中提到】
: 这道题就是那道被讨论得热火朝天的MS老题,如何把负数扫到左边,正数扫到右边。对
: 所有的正数和所有的负数,都不能改变原有的相对次序
: /*
: {1, 5, -5, -8, 2, -1, 15}
: 要把负的扫到左边,正的扫到右边。
: 不能改变顺序
: 得到{-5 -8 -1 1 5 2 15}
: */
: void swap_numbers(int input[], int n)
: {

l******g
发帖数: 59
12
quick_sort, partition

【在 j**l 的大作中提到】
: 这道题就是那道被讨论得热火朝天的MS老题,如何把负数扫到左边,正数扫到右边。对
: 所有的正数和所有的负数,都不能改变原有的相对次序
: /*
: {1, 5, -5, -8, 2, -1, 15}
: 要把负的扫到左边,正的扫到右边。
: 不能改变顺序
: 得到{-5 -8 -1 1 5 2 15}
: */
: void swap_numbers(int input[], int n)
: {

y**i
发帖数: 1112
13
这个不能保证稳定性

【在 l******g 的大作中提到】
: quick_sort, partition
r****o
发帖数: 1950
14
你说的稳定性是数据的相对order吗?
我想了一下,quick sort的每次partition后,似乎能保证所有比pivot小的元素们的位
置的相对顺序都不变,但大于等于pivot的元素们的位置的相对顺序有可能变化。
我说的对不对?

【在 y**i 的大作中提到】
: 这个不能保证稳定性
1 (共1页)
进入JobHunting版参与讨论
相关主题
一个精华区的算法题这道题太神奇了,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),
看看这道题从水木上看到个数组题
问一个给定的array 和一个sum value,找最小sub-array,谢谢请大牛解释一下leetcode新题
讨论下找两个元素和为0的题延伸复杂度是O(n),英语怎么说?
MS那个扫正数和负数的题目偏难fibonacci 复杂度这么简单推一下对不对?
再来讨论一个题!求个递归复杂度答案
Microsoft 校园面试面经 + Onsite 求 Bless想问下 Word Break II 这道题
讨论一道老题:分离数组中的正负数 (转载)这道题要用什么数据结构?
相关话题的讨论汇总
话题: input话题: int话题: temp话题: 扫到话题: 正数