js五种排序

一、冒泡排序

(1)算法描述和实现

1、比较相邻的元素。如果第一个比第二个大,就交换它们两个;

2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;

3、针对所有的元素重复以上的步骤,除了最后一个;

4、重复步骤1~3,直到排序完成。

动图演示:http://img.blog.csdn.net/20160916160748389

(2)算法分析

最佳情况:T(n) = O(n)

最差情况:T(n) = O(n2)

(3)JavaScript代码实现:

functionbubbleSort(arr) {

varlen = arr.length;

for(vari =0; i < len; i++) {

for(varj =0; j < len -1- i; j++) {

if(arr[j] > arr[j+1]) {//相邻元素两两对比

vartemp = arr[j+1];//元素交换

arr[j+1] = arr[j];

arr[j] = temp;

}

}

}

returnarr;

}

vararr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];

console.log(bubbleSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]

二、选择排序

(1)算法描述和实现

首先从原始数组中找到最小的元素,并把该元素放在数组的最前面,

然后再从剩下的元素中寻找最小的元素,放在之前最小元素的后面,直到排序完毕。

动图演示:http://img.blog.csdn.net/20160916164754013

(2)算法分析

最佳情况:T(n) = O(n2)

最差情况:T(n) = O(n2)

(3)JavaScript代码实现:

functionselectionSort(arr){

varlen = arr.length;

varminIndex,temp;

for(vari =0; i < len -1; i ++){

minIndex = i;

for(varj = i +1; j < len; j ++){

if(arr[j] < arr[minIndex]){//寻找最小的数

minIndex = j;//将最小数的索引保存

}

}

temp = arr[i];

arr[i] = arr[minIndex];

arr[minIndex] = temp;

}

returnarr;

}

vararr = [3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];

console.log(selectionSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]

三、插入排序

(1)算法描述和实现

将n个元素的数列分为已有序和无序两个部分。

数列:{a1,a2,a3,a4,…,an}

将该数列的第一元素视为有序数列,后面都视为无序数列:

{{a1},{a2,a3,a4,…,an}}

将无序数列中的元素插入到有序数列的对应位置,插入前通过比大小的方式找到其在有序数列中的对应位置。

1、从第一个元素开始,该元素可以认为已经被排序;

2、取出下一个元素,在已经排序的元素序列中从后向前扫描;

3、如果该元素(已排序)大于新元素,将该元素移到下一位置;

4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

5、将新元素插入到该位置后;

6、重复步骤2~5。

动图演示:http://img.blog.csdn.net/20160916173802597

(2)算法分析

最佳情况:T(n) = O(n)

最差情况:T(n) = O(n2)

(3)JavaScript代码实现:

functioninsertionSort(array) {

//假设第0个元素是一个有序的数列,第1个以后的是无序的序列,

//所以从第1个元素开始将无序数列的元素插入到有序数列中

for(vari =1; i < array.length; i++) {

//取出无序数列中的第i个作为被插入元素

varkey = array[i];

//记住有序数列的最后一个位置

varj = i -1;

//比大小,找到被插入元素所在的位置

while(j >=0&& array[j] > key) {

array[j +1] = array[j];

j--;

}

//插入

array[j +1] = key;

}

returnarray;

}

四、快速排序

(1)算法描述和实现

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

1、从数列中挑出一个元素,称为“基准”(pivot);

2、所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。

3、对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

(2)算法分析

最佳情况:T(n) = O(nlogn)

最差情况:T(n) = O(n2)

(3)JavaScript代码实现:

functionquickSort(arr) {

if(arr.length <=1) {returnarr; }

varpivotIndex = Math.floor(arr.length /2);

varpivot = arr.splice(pivotIndex,1)[0];

varleft = [];

varright = [];

for(vari =0; i < arr.length; i ++){

if(arr[i] < pivot) {

left.push(arr[i]);

}else{

right.push(arr[i]);

}

}

returnquickSort(left).concat([pivot], quickSort(right));

};

vararr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];

console.log(quickSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]

五、归并排序

(1)算法描述和实现

归并排序:其基本思想是分治策略,先进行划分,然后再进行合并。

假设要对数组C进行归并排序,步骤是:

1.先将C划分为两个数组A和B(即把数组C从中间分开)

2.再分别对数组A、B重复步骤1的操作,逐步划分,直到不能再划分为止(每个子数组只剩下一个元素),这样,划分的过程就结束了。

如:[12 20 30 21 15 33 26 19 40 25]

划分为:  [12 20 30 21 15]

[33 26 19 40 25]

[12 20]      [30 21 15]       [33 26]

[19 40 25]

[12]  [20]   [30]  [21 15]     [33]  [26]

[19]    [40 25]

[12]  [20]   [30] [21] [15]    [33]  [26]

[19]   [40] [25]

3.然后从下层往上层不断合并数组,每一层合并相邻的两个子数组,合并的过程是每次从待合并的两个子数组中选取一个最小的元素,然后把这个元素放到合并后的数组中,不断重复直到把两个子数组的元素都放到合并后的数组为止。

4.依次类推,直到合并到最上层结束,这时数据的排序已经完成了。

[if !vml]

[endif]

[if !vml]

[endif]

动图演示:http://img.blog.csdn.net/20160917001326254

(2)算法分析

最佳情况:T(n) = O(n)

最差情况:T(n) = O(nlogn)

(2)JavaScript代码实现:

functionmergeSort(arr){//采用自上而下的递归方法

varlen = arr.length;

if(len <2){

returnarr;

}

varmiddle = Math.floor(len /2),

left = arr.slice(0,middle),//得到下标从0~index-1的数组

right = arr.slice(middle);//得到下标从index开始到末尾的数组

returnmerge(mergeSort(left),mergeSort(right));//里面采用递归

}

functionmerge(left,right){//每次left或者right都是要shift掉第一个元素,最后arr.concat,因为不知道left或者right其中一个哪个剩下元素,所以要将剩下的元素给加上

varresult = [];

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());

returnresult;

}

vararr = [3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];

console.log(mergeSort(arr));

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352