高德纳在《计算机程序设计艺术》里对算法归纳为以下几点:
- 输入: 一个算法必须有零或以上的输入量
- 输出: 一个算法应有一个或以上的输出量
- 明确性: 算法的描述必须无歧义,实际运行结果是确定的
- 有限性: 必须在有限个步骤内结束
- 有效性: 又称可行性,能够被执行者实现
如果想详细研究算法推荐《数据结构与算法分析》
数组array含有N个正整数
输入量为array
请将array中的数字从小到大排列
输出量为排好序的数组
代码例子
var array = [5,2,4,6,8]
function sort(){
你的代码
}
sort(array) === [2,4,5,6,8]
当你遇到思路障碍怎么办?
重复地比较要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。比较数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。每比较一整轮,最大的都会出现在最后故名---冒泡排序
流程如下:
function bubbleSort(array) {
for (let i = 0; i < array.length - 1; i++) {
for (let j = 0; j < array.length - i - 1; j++) {
if (array[j] > array[j + 1]) {
let temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
流程如下:
function selectSort(arr) {
var minIndex, 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;
}
将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序。是稳定的排序方法。
流程如下:
function insertionSort(array) {
for (let i = 1; i < array.length; i++) {
let key = array[i];
let j = i - 1;
while (j >= 0 && array[j] > key) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = key;
}
return array;
}
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
流程如下:
function mergeSort(arr) {
var len = arr.length;
if (len < 2) {
return arr;
}
var middle = Math.floor(len / 2),
left = arr.slice(0, middle),
right = arr.slice(middle);
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
var 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;
}
每个元素找到自己对应的位置(前面的都比我小,后面的都比我大)
流程如下:
function quickSort(array) {
function quick(array, left, right) {
let index;
if (array.length > 1) {
index = partition(array, left, right);
if (left < index - 1) {
quick(array, left, index - 1);
}
if (index < right) {
quick(array, index, right);
}
}
return array;
}
function partition(array, left, right) {
const pivot = array[Math.floor((right + left) / 2)];
let i = left;
let j = right;
while (i <= j) {
while (array[i] < pivot) {
i++;
}
while (array[j] > pivot) {
j--;
}
if (i <= j) {
[array[i], array[j]] = [array[j], array[i]]
i++;
j--;
}
}
return i;
}
quick(array, 0, array.length - 1);
};
顾名思义,就是在快速排序的基础上,加入随机的机制.
在快速排序的时候我们是从左到右来选取比较对象,在随机快速排序中我们是随机来选取对象.
流程如下:
function quickSort(array) {
function quick(array, left, right) {
let index;
if (array.length > 1) {
index = partition(array, left, right);
if (left < index - 1) {
quick(array, left, index - 1);
}
if (index < right) {
quick(array, index, right);
}
}
return array;
}
function partition(array, left, right) {
const pivot = array[Math.floor(Math.random()*array.length)];
let i = left;
let j = right;
while (i <= j) {
while (array[i] < pivot) {
i++;
}
while (array[j] > pivot) {
j--;
}
if (i <= j) {
[array[i], array[j]] = [array[j], array[i]]
i++;
j--;
}
}
return i;
}
quick(array, 0, array.length - 1);
};