快捷搜索:  as

常见的几种排序算法总结

对付非科班生的我来说,算法彷佛对我来说是个难点,查阅了一些资料,趁此来懂得一下几种排序算法。

首先懂得一下,什么是法度榜样

一个法度榜样主要包括以下两方面的信息:

1、对数据的描述,在法度榜样中要指定用到哪些数据类型以及这些数据的类型和数据的组织形式,这便是数据布局

2、对操作的描述,即要求谋略机进行操作的步骤,便是算法

对付一种法度榜样设计职员来说,算法,数据布局,法度榜样化设计措施和法度榜样说话是其所应的常识,算法是灵魂,数据布局是加工工具,说话是对象。

几种常见排序

关于排序算法平日我们所说的每每指的是内部排序算法,即数据记录在内存中进行排序。

排序算法大年夜体可分为两种:

一种是对照排序,光阴繁杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。

另一种长短对照排序,光阴繁杂度可以达到O(n),主要有:计数排序,基数排序,桶排序等

1. 冒泡排序

1.1 简介

冒泡排序它重复地访问过要排序的元素,一次对拍照邻两个元素,假如他们的顺序差错就把他们更换过来,直到没有元素再必要互换,排序完成。这个算法的名字由来是由于越小(或越大年夜)的元素会经过互换逐步“浮”到数列的顶端。

1.2 实现历程

1.3 代码实现

function swap(myArray, p1, p2){

var temp = myArray[p1];

myArray[p1] = myArray[p2];

myArray[p2] = temp;

}

function bubbleSort(myArray){

var len = myArray.length;

for (var i = 0; imyArray[j + 1]){

swap(myArray, j, j + 1);

}

}

}

return myArray;

}

bubbleSort([1,2,4,5,3]) //[1,2,3,4,5]

2 选择排序

2.1 简介

选择排序类似于冒泡排序,只不过选择排序是首先在未排序的序列中找到最小值(最大年夜值),放到序列的肇端位置,然后再从残剩未排序元素中继承探求最小(大年夜)元素,放到已排序序列的末端,以此类推,直到所有元素均排序完毕。

2.2 实现历程

2.3 代码实现

function swap(myArray, p1, p2){

var temp = myArray[p1];

myArray[p1] = myArray[p2];

myArray[p2] = temp;

}

function selectionSort(myArray){

var len = myArray.length;

var min;

for (var i = 0; i

3 插入排序

3.1 简介

插入排序比冒泡排序和选择排序更有效率,插入排序类似于生活中抓扑克牌来。

插入排序详细算法描述,以数组[3, 2, 4, 5, 1]为例。

将数组分成[3]和[2, 4, 5, 1]两部分,前者是已排序的,后者是未排序的。

掏出未排序部分的第一个元素“2”,与已排序部分着末一个元素“3”对照,由于2小于3,以是2排在3前面,全部数组变成[2, 3]和[4, 5, 1]两部分。

3.掏出未排序部分的第一个元素“4”,与已排序部分着末一个元素“3”对照,由于4大年夜于3,以是4排在3后面,全部数组变成[2, 3, 4]和[5, 1]两部分。

掏出未排序部分的第一个元素“5”,与已排序部分着末一个元素“4”对照,由于5大年夜于4,以是5排在4后面,全部数组变成[2, 3, 4, 5]和[1]两部分。

掏出未排序部分的第一个元素“1”,与已排序部分着末一个元素“5”对照,由于1小于5,以是再与前一个元素“4”对照;由于1小于4,再与前一个元素“3”对照;由于1小于3,再与前一个元素“2”对照;由于小于1小于2,以是“1”排在2的前面,全部数组变成[1, 2, 3, 4, 5]。

3.2 实现历程

3.3 代码实现

function insertionSort(myArray) {

var len = myArray.length,// 数组的长度

value,// 当前对照的值

i,// 未排序部分确当前位置

j;// 已排序部分确当前位置

for (i=0; i-1 && myArray[j] > value; j--) {

myArray[j+1] = myArray[j];

}

myArray[j+1] = value;

}

return myArray;

}

insertionSort([1,2,4,5,3]) // [1,2,3,4,5]

4 归并排序

4.1 简介

前面三种排序算法只有教授教化代价,由于效率低,很少实际应用。归并排序(Merge sort)则是一种被广泛应用的排序措施。

它的基础思惟是,将两个已经排序的数组合并,要比从头开始排序所有元向来得快。是以,可以将数组拆开,分成n个只有一个元素的数组,然后赓续地两两合并,直到整个排序完成。

以对数组[3, 2, 4, 5, 1] 进行从小到大年夜排序为例,步骤如下:

将数组分成[3, 2, 4]和[5, 1]两部分。

将[3, 2, 4]分成[3, 2]和[4]两部分。

将[3, 2]分成[3]和[2]两部分,然后合并成[2, 3]。

将[2, 3]和[4]合并成[2, 3, 4]。

将[5, 1]分成[5]和[1]两部分,然后合并成[1, 5]。

将[2, 3, 4]和[1, 5]合并成[1, 2, 3, 4, 5]。

4.2 实现历程

4.3 代码实现

function merge(left, right){

var result= [],

il = 0,

ir = 0;

while (il

有了merge函数,就可以对随意率性数组排序了。基础措施是将数组赓续地拆成两半,直到每一半只包孕零个元素或一个元素为止,然后就用merge函数,将拆成两半的数组赓续合并,直到合并成一全部排序完成的数组。

function mergeSort(myArray){

if (myArray.length

5 快速排序

5.1 简介

快速排序(quick sort)是公认最快的排序算法之一,有着广泛的利用。

快速排序算法步骤

从序列中挑出一个元素,作为"基准"(pivot).

把所有比基准值小的元素放在基准前面,所有比基准值大年夜的元素放在基 准的后面(相同的数可以到任一边),这个称为分区(partition)操作。

对每个分区递归地进行步骤1~3,递归的停止前提是序列的大年夜小是0或1,这时整体已经被排好序了。

5.2 实现历程

5.3 代码实现

// 支配一个swap函数,用于交换两个位置的值。

function swap(myArray, firstIndex, secondIndex){

var temp = myArray[firstIndex];

myArray[firstIndex] = myArray[secondIndex];

myArray[secondIndex] = temp;

}

// 支配一个partition函数,用于完成一轮排序。

function partition(myArray, left, right) {

var pivot = myArray[Math.floor((right + left) / 2)],

i = left,

j = right;

while (ipivot) {

j--;

}

if (i

// 递归上面的历程,完成全部排序。

function quickSort(myArray, left, right) {

if (myArray.length

参考:

常用排序算法总结(一)

阮一峰-算法总结

您可能还会对下面的文章感兴趣: