计数排序是稳定排序,而且是线性时间内的排序算法,时间复杂度是O(n + k)其中k是待排序数组的范围。计数排序不是原址排序,空间复杂度是O(n + k)
//k是指A中的数组范围是0~k 包括0和k
void count_sort(int A[], int B[], int n, int k)
{
int *C = (int *)malloc(sizeof(int) * ...
分类:
编程语言 时间:
2015-08-04 00:39:31
阅读次数:
131
为什么要进行算法分析?
预测算法所需的资源
计算时间(CPU 消耗)内存空间(RAM 消耗)通信时间(带宽消耗)
预测算法的运行时间
在给定输入规模时,所执行的基本操作数量,或者称为算法复杂度(Algorithm Complexity)
如何衡量算法复杂度?
内存(Memory)时间(Time)指令的数量(Number of Steps)特定...
分类:
编程语言 时间:
2015-08-02 21:44:16
阅读次数:
213
示例代码(1)
decimal Factorial(int n)
{
if (n == 0)
return 1;
else
return n * Factorial(n - 1);
}
【分析】
阶乘(factorial),给定规模 n,算法基本步骤执行的数量为 n,所以算法复杂度为 O(n)。
示例代码(2)
int FindMaxElement(int[] array)
{
int max = array[0]...
分类:
编程语言 时间:
2015-08-02 21:43:05
阅读次数:
174
这题看似简单,不过两个要求很有意思:1、不准用除法:最开始我想到的做法是全部乘起来,一项项除,可是中间要是有个0,这做法死得很惨。2、空间复杂度O(1):题目说明了返回的那个数组不算进复杂度分析里面做法:既然不用除法,对于某个数i, result[i] = 0到i - 1的乘积 X i + 1...
分类:
其他好文 时间:
2015-08-02 19:46:56
阅读次数:
124
一、因为要判断左右链表的断电的对称,可以先将节点取出,放到vector当中,然后使用随机访问的方式对其进行对称性判断空间复杂度为 O(n),时间复杂度为O(n)二、可否将空间复杂度降下来,可以采用两个指针,将链表分为两部分。dummy->head从dummy开始一个指针每次前进一步,另一个指针每次前...
分类:
其他好文 时间:
2015-08-02 13:06:59
阅读次数:
158
/*
两个字符串A、B。从A中剔除存在于B中的字符。
比如A = “hello world”, B = "er",那么剔
除之后A变为"hllo wold"。空间复杂度要求是O(1)
,时间复杂度越优越好。
*/
#include
#include
using namespace std;
void Grial(char *str,char *ptr)
{...
分类:
编程语言 时间:
2015-08-02 06:24:28
阅读次数:
127
计数排序
计数排序假设n个输入元素中的每一个都是介于0到k之间的整数。此处k为某个整数(输入数据在一个小范围内)。
算法思想
计数排序的基本思想是对每一个输入元素x,确定出小于x的元素的个数。然后再将x直接放置在它在最终输出数组中的位置上。
由于数组中可能有相等的数,在处理时需要注意。
时间复杂度和空间复杂度分析
算法总时间Θ(k + n)。当k=O(n)时,计数排序的...
分类:
编程语言 时间:
2015-08-01 23:35:40
阅读次数:
151
归并排序典型的分治策略的体现,时间复杂度是O(nlgn), 空间复杂度是O(n).属于稳定排序。
下面是C语言实现代码。
#define MAX 10000000
//p, q, r是均是元素的下标
void merge(int A[], int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r - q;
int...
分类:
编程语言 时间:
2015-08-01 20:37:03
阅读次数:
145
例:长度为N的数组,把奇数放到数组的前面,偶数放到数组的后面 空间复杂度为O(1)核心思想是:定义两个指针,一个指针A从前往后扫描,一个指针B从后往前扫描。指针A扫描到偶数暂停,指针B扫描到奇数暂停,然后交换着两个数,交换之后继续如上述扫描和交换,直到指针A和指针B重合停止。C语言中&表示按位与,0...
分类:
编程语言 时间:
2015-08-01 07:39:16
阅读次数:
108
手摇算法(也叫三次反转算法)
看题:将字符串abcdefg,变成efgabcd,要求空间复杂度O(1)。
解答:
第一步:将子串abcd反转,变成dcba。源字符串变成dcbaefg第二步:将字串efg反转,变成gfe。源字符串变成dcbagfe第三步:将整个字符串dcbagfe反转,变成efgabcd。
手摇算法常常被用来旋转字符串。同时,手摇算法也可以用来做原地归并...
分类:
编程语言 时间:
2015-07-31 10:37:41
阅读次数:
189