高德纳在他的著作《计算机程序设计艺术》里对算法的特征归纳:
- 输入:一个算法必须有零个或以上输入量。
- 输出:一个算法应有一个或以上输出量,输出量是算法计算的结果。
- 明确性:算法的描述必须无歧义,以保证算法的实际执行结果是精确地匹配要求或期望,通常要求实际运行结果是确定的。
- 有限性:依据图灵的定义,一个算法是能够被任何图灵完备系统模拟的一串运算,而图灵机只有有限个状态、有限个输入符号和有限个转移函数(指令)。而一些定义更规定算法必须在有限个步骤内完成任务。
- 有效性:又称可行性。能够实现,算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。
常见排序算法
1.冒泡排序:依次两两对比将大的数往后换位置,得到当前最大数固定位置再从头开始
2.选择排序:选出当前最小的数交换位置放到最前面,依次重复
3.插入排序:参考起扑克牌,将新起的数字对比大小后插在对应位置
4.快速排序:第一个数固定位置,依次将后面的数根据大小放在左右两边,再从头循环
5.随机快排:不再从头开始选取,而是随机选取任意位置数字将其他数字排在左右
6.计数排序:根据数字大小创建一系列的桶,直接从头依次将数字放到对应桶中再取出
7.桶排序:根据实际情况按照一定范围创建桶,再将分好桶后的数组分别排序
8.基数排序;创建0-9共10个桶,根据数字的个位数放入桶中再依次取出,再根据十位数循环
9.堆排序:利用完全二叉树和最大堆调整进行排序
交换位置:a=1 b=2
1.引入变量
t=a => t=1
a=b => a=2
b=t => b=1
2.合并剔除
a=a+b => a=3
b=a-b => b=1
a=a-b => a=2
冒泡排序代码
let array = [53, 76, 12, 64, 77, 22, 44, 34]
function sort(array) {
len = array.length
for (var i = 0; i < len - 1; i++) {
for (var j = 0;j < len - 1 - i; j++) {
if (array[j] > array[j + 1]) {
let t = array[j]
array[j] = array[j + 1]
array[j + 1] = t
}
}
}
return array
}
console.log(sort(array))
排序算法可视化:
Sorting (Bubble, Selection, Insertion, Merge, Quick, Counting, Radix)visualgo.net常见数据结构
1.哈希(hash):key-value键值对
2.队列(queue):先进先出,参考日常排队的形式
3.栈(stack):先进后出,参考盗梦空间的梦境形式
4.链表(linked list):前一个元素明确指出自己的下一个元素
5.数(tree):层级结构,完全二叉树