算法的定义
在数学和计算机科学/算学之中,算法/演算法/算则法(Algorithm)为一个计算的具体步骤,常用于计算、数据处理和自动推理。精确而言,算法是一个表示为有限长列表的有效方法。算法应包含清晰定义的指令用于计算函数。
算法中的指令描述的是一个计算,当其运行时能从一个初始状态和初始输入(可能为空)开始,经过一系列有限而清晰定义的状态最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。
形式化算法的概念部分源自尝试解决希尔伯特提出的判定问题,并在其后尝试定义有效计算性或者有效方法中成形。这些尝试包括库尔特·哥德尔、雅 克·埃尔布朗和斯蒂芬·科尔·克莱尼分别于1930年、1934年和1935年提出的递归函数,阿隆佐·邱奇于1936年提出的λ演算,1936年 Emil Leon Post的Formulation 1和艾伦·图灵1937年提出的图灵机。即使在当前,依然常有直觉想法难以定义为形式化算法的情况。
算法的特征
以下是高德纳在他的著作《计算机程序设计艺术》里对算法的特征归纳:
- 输入:一个算法必须有零个或以上输入量。
- 输出:一个算法应有一个或以上输出量,输出量是算法计算的结果。
- 明确性:算法的描述必须无歧义,以保证算法的实际执行结果是精确地匹配要求或期望,通常要求实际运行结果是确定的。
- 有限性:依据图灵的定义,一个算法是能够被任何图灵完备系统模拟的一串运算,而图灵机只有有限个状态、有限个输入符号和有限个转移函数(指令)。而一些定义更规定算法必须在有限个步骤内完成任务。
- 有效性:又称可行性。能够实现,算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。
算法设计的方法
- 分治法
- 动态规划法
- 贪婪算法
- 线性规划法
- 简并法
排序算法
1. 冒泡排序
伪代码:
a {
'0':1,
'1':3,
'2':5,
'3':2,
'4':4,
'length':5
}
轮数 = 1
while ( 轮数 < a['length'] )
index = 0
while (index <= a['length'] - 1 - 轮数)
if a[index] < a [index + 1]
else
t <- a[index]
a[index] <- a[index + 1]
a[index + 1] <- t
end
index <- index + 1
end
轮数 <- 轮数 + 1
end
print a
流程图
2. 选择排序
伪代码:
a {
'0':2,
'1':0,
'2':3,
'3':8,
'4':1,
'5':7,
'length':6
}
轮数 = 1
while (轮数 < a['length'])
minIndex <- 轮数 - 1
index <- 轮数
while (index < a['length'])
if a[index] < a[minIndex]
a[index] <- a[minIndex]
end
index <- index + 1
end
t <- a[轮数-1]
a[轮数-1] <- a[minIndex]
a[minIndex] <- t
轮数 <- 轮数 + 1
end
print a
流程图:
3. 计数排序
伪代码:
a {
'0': 2,
'1': 1,
'2': 4,
'3': 6,
'4': 2,
'length': 5,
}
// 入桶
hash <- {}
index = 0
while (index < a['length'])
number <- a[index]
if hash[number] == undefined
hash[number] = 1
else
hash[number] <- hash[number] + 1
end
index <- index + 1
// 找出a的最大值
// findMax(a)
// index2 <- 0
// max <- a[index2]
// while (index2 < a['length'] - 1)
// if a[index2] < a[index2 + 1]
// max <- a[index2 + 1]
// else
// max <- a[index2]
// end
// index2 <- index2 + 1
// end
// 出桶
index3 <- 0
max <- findMax(a)//确定hash长度
newArr <- {}
while (index3 < max + 1)
count <- hash[index3]
if count != undefined //count 存在
countIndex <- 0
while(countIdext < count)
newArr.push(index3)
countIndex <- countIndex + 1
end
end
index2 <- index2 + 1
end
print newArr
流程图: