什么是算法?
以下是高德纳在他的著作《计算机程序设计艺术》里对算法的特征归纳:
输入:一个算法必须有零个或以上输入量。
输出:一个算法应有一个或以上输出量,输出量是算法计算的结果。
明确性:算法的描述必须无歧义,以保证算法的实际执行结果是精确地匹配要求或期望,通常要求实际运行结果是确定的。
有限性:依据图灵的定义,一个算法是能够被任何图灵完备系统模拟的一串运算,而图灵机只有有限个状态、有限个输入符号和有限个转移函数(指令)。而一些定义更规定算法必须在有限个步骤内完成任务。
有效性:又称可行性。能够实现,算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。
什么是数据结构
就是数据的结构。
一般来说是这样的:
- 我们要解决一个跟数据相关的问题
- 分析这个问题,想出对应的数据结构
- 分析数据结构,想出算法
数据结构和算法是互相依存、不可分开的
你学习完排序算法,就能了解常见的数据结构
排序算法
体育委员两两摸头法(冒泡排序)
体育老师一指禅法(选择排序)
起扑克牌法(插入排序)
强迫症收扑克牌法(基数排序)
快排
归并排序
堆排序
排序可视化:https://visualgo.net/bn/sorting
1. 冒泡排序 2. 选择排序 3. 桶排序
冒泡排序
伪代码
a <- {
'0':4,
'1':6,
'2':3,
'3':2,
'4':1,
'length': 5
}
轮数 = 1
左手指向的下标
while(轮数 < a['length'])
左手指向的下标 = 0
while(左手指向的下标 <= a['length'] - 1 - 轮数)
if a[左手指向的下标] < a[左手指向的下标+1]
// 什么也不做
else
// 交换左右的位置
t <- a[左手指向的下标]
a[左手指向的下标] <- a[左手指向的下标+1]
a[左手指向的下标+1] <- t
end
左手指向的下标 <- 左手指向的下标+1
end
轮数 <- 轮数 + 1
end
print a
/////////
轮数 左手指向的下标最大值(从0开始)
1 3
2 2
3 1
4 0
冒泡排序 摸摸头法.png
选择排序
伪代码
a <- {
'0':3,
'1':5,
'2':1,
'3':7,
'4':2,
'5':6,
'length':6
}
轮数 <- 1
while (轮数 < a['length'])
minIndex <- 轮数-1
index <- minIndex+1
while (index < a['length'])
if(a[minIndex] < a[index])
index <- index+1
else
minIndex <- index
index <- index+1
end
t <- a[轮数-1]
a[轮数-1] <- a[minIndex]
a[minIndex] <- t
index <- index+1
end
print a
end
选择排序 .png
计数排序
伪代码
a <- {
'0':0,
'1':2,
'2':1,
'3':56,
'4':4,
'5':67,
'6':3,
'length:7'
}
hash <- {}
index <- 0
while index < a['length']
number <- a[index]
if hash[number] == undefined // hash[number] 不存在
hash[number] = 1
else
hash[number] <- hash[number] + 1
end
index <- index + 1
end
index2 <- 0
max <- findMax(a) // 最大值67
newArr <- {}
while index2 < max + 1
count <- hash[index2]
if count != undefined // count 存在
countIndex <- 0
while countIndex < count
newArr.push(index2)
countIndex <- countIndex + 1
end
end
index2 <- index2 + 1
end
print newArr
计数排序.png
网友评论