1.冒泡排序
定义:
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的计算机科学,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
自己总结:
通俗来说,就是在一个元素列里,将相邻的两个元素进行比较,比较结束后就是将大的放在小的后面,一直两两相比,直到这一个元素列全部是从小到大进行排列。
实现:
function bubbleSort(arr) {
let len = arr.length;
for (let i = 0; i < len - 1; i++) {
for (let j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) { // 相邻元素两两对比
let temp = arr[j+1]; // 元素交换
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
2.选择排序
定义:
选择排序是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。重复此操作,直到所有元素均排序完毕。
自己总结:
通俗来说,就是对一个元素列进行不断循环,每一次循环都找出一个最小值放在最前面。第二次循环不包括第一次已经排好位置的元素,重复循环,找出相对于这个元素列第二小的元素放在第二位。重复上述循环,直到这一个元素列全部是从小到大进行排列。
实现:
function selectionSort(arr) {
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) { // 寻找最小的数
minIndex = j; // 将最小数的索引保存
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
3.插入排序
定义:
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
自己总结:
通俗来说,就是将一个元素列中第二个元素相比,比完之后小的放前面大的防后面。再将元素列中的第三个元素和前两个元素相比,并放置于合适位置。重复此操作,让元素列中每一个元素都比较到。直到这一个元素列全部是从小到大进行排列。
实现:
function insertionSort(arr) {
var len = arr.length;
var preIndex, current;
for (var i = 1; i < len; 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;
}
4.希尔排序
定义:
希尔排序又叫“递减增量排序”,是一种插入排序,可以理解为直接插入排序的优化版。希尔排序将序列按照一定的增量划分为一个个小序列,每个小序列使用直接插入排序,完成后增量递减,每个小序列变大,继续进行直接插入排序,直到增量递减为1,进行最后的直接插入排序。
希尔排序的类比:类似于我们有一叠正常的扑克牌,现在我们要将其从小到大按照红桃、黑桃、梅花、方块进行排序,我们首先按照红黑梅方划分为四组,则增量可以理解为4,每组进行直接排序,后面增量为1,只有1组,我们只需要进行一次直接排序就行。
实现:
function shellSort(arr) {
var len = arr.length,
temp,
gap = 1;
while(gap < len/3) { //动态定义间隔序列
gap =gap*3+1;
}
for (gap; gap > 0; gap = Math.floor(gap/3)) {
for (var i = gap; i < len; i++) {
temp = arr[i];
for (var j = i-gap; j >= 0 && arr[j] > temp; j-=gap) {
arr[j+gap] = arr[j];
}
arr[j+gap] = temp;
}
}
return arr;
}
5.归并排序
定义:
归并排序是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)。
实现:
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;
}