简介
对计算机中存储的数据执行的两种最常见的操作是排序和检索,也是面试经常会被问到的一个知识点,本文将整理数据排序的基本算法和高级算法。其中基本排序算法有:冒泡排序、选择排序、插入排序。高级排序算法有:希尔排序、归并排序、快速排序。
通常排序问题都可以分隔为相同的小规模问题来解决,即问题的解决都是递归的思路。
冒泡排序
首先声明,这是最慢的排序算法之一,但是也是最容易实现的排序算法。
算法描述:对于一个数列,从第一个元素开始,依次对相邻元素进行两两比较,如果第一个元素大于第二个元素就交换他们的位置。
稳定性:冒泡排序为一种稳定排序。
步骤:
1.从第一个元素开始,比较相邻的元素,如果第一个比第二个大,就交换他们的位置,一次排序可以将大元素沉底。
2.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
function bubble(list){
for (var i=1; i<list.length; i++){//比较的趟数
for(var j=0; j<list.length-i; j++){//比较的指针
if(list[j]>list[j+1]){//如果第一个元素大于第二个,交换二者的位置
list[j] = list[j] + list[j+1];
list[j+1] = list[j] - list[j+1]; //list[j]
list[j] = list[j] - list[j+1]; //list[j+1]
}
}
}
return list;
}
选择排序
算法描述:从数组的开头开始,将第一个元素和其他元素进行比较。检查完所有元素后最小的元素将会被放到数组的第一个位置,然后对第二个元素执行相同的操作,最后直到所有的元素排序完毕。
稳定性:选择排序是一种不稳定的排序。
function selection(list){
for(var i=0; i<list.length-1; i++){
for(var j=i+1; j<list.length; j++){
if(list[i]>list[j]){ //交换二者的位置
list[i] = list[i]+list[j];
list[j] = list[i]-list[j];
list[i] = list[i]-list[j];
}
}
}
return list;
}
插入排序
算法描述:对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,直到所有的数据排序完毕。
步骤:
1.第一个元素,认为已经被排序。
2.下一个元素,从已排序的的序列中从前向后扫描,一直找到大于或等于它的元素,将此元素插入到那个元素之前。
3.重复步骤2.
稳定性:插入排序是一个稳定排序。
function insert(list){
for(var i =1; i<list.length; i++){//对第i个元素进行插入排序
for(var j=0; j<i; j++) {
if(list[i]<=list[j]){//进行插入操作
var a = list[i]; //暂时存储list[i]
for(var k=i; k>=j; k--){//从j到i-1的元素向后移动一位
list[k] = list[k-1];
}
list[j] = a;
}
}
}
return list;
}
希尔排序
希尔排序是在插入排序的基础上改进的。希尔排序是基于插入排序的以下两点性质而提出改进方法的:
1、插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
2、但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位
步骤:
1.先取一个小于n的整数d1作为第一个增量,把所有距离为d1的元素放在同一个分组中,先在各组内进行直接插入排序;
2.然后取第二个增量d2<d1重复上述分组和排序,直到增量=1;
一般的初次取序列的一半为增量,以后每次减半,直到增量为1。
稳定性:希尔排序是不稳定排序
归并排序
实现原理是把一系列排好序的字序列合并成一个大的完整有序序列。
快速排序
快速排序是出力大数据集最快的排序算法之一。它是一种分而治之的算法,通过递归的方式将数据一次分解为包含小元素和包含大元素的不同子序列。然后不断重复这个步骤直到所有数据都是有序的。快速排序非常适合大型数据集合的排序,对于小数据集时性能反而会有下降。
步骤:
1.选择一个基准元素,将列表分隔成两个子序列;
2.对序列重新排序,将所有小于基准值的元素放在基准值前面,所有大于基准值的元素放在基准值后面;
3.分别对较小元素的子序列和较大元素的子序列重复步骤1、2。
稳定性:快速排序是不稳定排序
function quickSort(list){
if(list.length == 0){
return [];
}
else{
var lesser = []; //小于基准值的序列
var greater = []; //大于基准值的序列
var pivot = list[0];
for(var i=1; i<list.length; i++){
if (list[i] <= pivot){
lesser.push(list[i]);
}
else{
greater.push(list[i]);
}
}
}
return quickSort(lesser).concat(pivot, quickSort(greater));
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。