以下是高德纳在他的著作《计算机程序设计艺术》里对演算法的特征归纳:
输入:一个算法必须有零个或以上输入量。
输出:一个算法应有一个或以上输出量,输出量是算法计算的结果。
明确性:算法的描述必须无歧义,以保证算法的实际执行结果是精确地符合要求或期望,通常要求实际执行结果是确定的。
有限性:依据图灵的定义,一个演算法是能够被任何图灵完备系统模拟的一串运算,而图灵机只有有限个状态、有限个输入符号和有限个转移函数(指令)。而一些定义更规定演算法必须在有限个步骤内完成任务。
有效性:又称可行性。能够实现,算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。
基于比较的排序算法:
不基于比较的排序算法:
实现思路
let bub = function bubbleSort(a) {
for (let i = 0; i < a.length - 1; i++) {
for (let j = 0; j < a.length - i - 1; j++) {
if (a[j] > a[j + 1]) {
let temp = a[j + 1]
a[j + 1] = a[j]
a[j] = temp
}
}
}
return a
}
let q = [29, 10, 14, 37, 14]
console.log(bub(q))
n个数据的直接选择排序可经过n-1趟直接选择排序得到有序结果。
let sel = function selectionSort(arr) {
let minIndex
let temp
for (let i = 0; i < arr.length - 1; i++) {
minIndex = i
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j
}
}
temp = arr[i]
arr[i] = arr[minIndex]
arr[minIndex] = temp
}
return arr
}
let q = [29, 10, 14, 37, 14]
console.log(sel(q))
n个数据的直接选择排序可经过n-1趟直接选择排序得到有序结果。
let ins = function insertionSort(arr) {
let preIndex
let current
for (let i = 1; i < arr.length; i++) {
preIndex = i - 1
current = arr[i]
while (preIndex >= 0 && arr[preIndex] > current) {
arr[preIndex + 1] = arr[preIndex]
preIndex--
}
arr[preIndex + 1] = current
}
return arr
}
let q = [29, 10, 14, 37, 14]
console.log(ins(q))
let mer = function mergeSort(arr) {
let len = arr.length
if (len < 2) {
return arr
}
let middle = Math.floor(len / 2)
let left = arr.slice(0, middle)
let right = arr.slice(middle)
return merge(mergeSort(left), mergeSort(right))
}
function merge(left, right) {
let result = []
while (left.length && right.length) {
if (left[0] <= right[0]) {
result.push(left.shift())
} else {
result.push(right.shift())
}
}
while (left.length) {
result.push(left.shift())
}
while (right.length) {
result.push(right.shift())
}
return result
}
let q = [29, 10, 14, 37, 14]
console.log(mer(q))
快速排序使用分治法来把一个数列为两个数列。
let qui = function quicSort(arr) {
if (arr.length <= 1) {
return arr
}
let pivotIndex = Math.floor(arr.length / 2)
let pivot = arr.splice(pivotIndex, 1)[0]
let left = []
let right = []
for (let i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quicSort(left).concat([pivot], quicSort(right));
}
let q = [29, 10, 14, 37, 14]
console.log(qui(q))