排序算法可以说是学习数据结构所必须的了,今天就将数据结构的排序算法整理一下,方便以后的整理和学习。
一、冒泡排序
描述:首先找出数组中最大或者最小的一个数将它放到最后,然后依次找出第二大或者小的数放在倒数第二的位置,如此循环n-1次,就可排序。
<script>
var data = [72,54,58,30,31,78,2,77,82,72];
var length = data.length;
var start = new Date().getTime();
for(var i=0;i<length-1;i++){
for(j=i+1;j<length;j++){
if(data[i]>data[j]){
var buffer = data[i];
data[i] = data[j];
data[j]=buffer;
}
}
}
var stop = new Date().getTime();
var elapsed = stop - start;
console.log(data);
console.log(elapsed);
</script>
二、选择排序
描述:首先将数组的第一个数设置为最小值min=a[0];然后向后依次比较每一个数,如果比min小则将两个数交换(看你是从小到大排序还是从大到小排序),然后将min往后移一位min=a[1],如此循环,直至排序完成。
<script>
var data = [72,54,58,30,31,78,2,77,82,72];
var length = data.length;
var start = new Date().getTime();
//设置最小值
var min ;
for(var i=0;i<=length-2;i++){
//将数组的第一个数赋值给min
min = i;
// 一次比较找出比min还小的数并将两个值进行交换
for(j=i+1;j<=length-1;j++){
if(data[min]>data[j]){
min = j;
}
}
// 将min最小值放在第i的位置
var buffer = data[i];
data[i] = data[min];
data[min]=buffer;
}
// 设置运算停止的时间
var stop = new Date().getTime();
// 计算算法所用的时间
var elapsed = stop - start;
console.log(data);
console.log(elapsed);
</script>
三、快速排序
描述:
先从数列中取出一个数作为基准数(一般为中间的一个数);分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边;再对左右区间重复第二步,直到各区间只有一个数。有点分治法和递归的思想。
案例:3 6 5 8 4 2 1 9
快排过程:
3 6 5 8 4 2 1 9 =>
2 1 |3| 6 5 8 4 9 =>
1 |2| |3| 5 4 |6| 8 9 =>
1 |2| |3| 4 |5| |6| |8| 9 =>
1 2 3 4 5 6 8 9
<script>
function quickSort(arr){
if(arr.length<=1){
return arr;//如果数组只有一个数,就直接返回;
}
var num = Math.floor(arr.length/2);//找到中间数的索引值,如果是浮点数,则向下取整
var numValue = arr.splice(num,1);//找到中间数的值并将其删除
var left = []; //创建左、右数组
var right = [];
for(var i=0;i<arr.length;i++){
if(arr[i]<numValue){
left.push(arr[i]);//基准点的左边的数传到左边数组
}
else{
right.push(arr[i]);//基准点的右边的数传到右边数组
}
}
return quickSort(left).concat([numValue],quickSort(right));//递归不断重复比较并将左右数组与基准数链接起来
}
console.log(quickSort([32,45,37,16,2,87]));//“2,16,32,37,45,87”
</script>
四、插入排序
描述:
假设第一个数是有序的,那么把后面的数拿出来插入到这个有序数的合适位置,假设是升序(比第一个数小则向后移动第一个数,将数插入到第一个数的前面),插入后有序区间扩大为两个,依次向后,不断拿出新的数插入到有序区间,再扩大这个有序区间直至区间大小等于排序数组的大小。
<script>
var data = [72,54,58,30,31,78,2,77,82,72];
var length = data.length;
var start = new Date().getTime();
for(var i=1;i<length;i++){
// 将当前数与之前的数进行比较,当碰到比他小的,就将当前数与之交换
while(i-1>=0&&data[i]<data[i-1]){
var temp =data[i];
data[i] = data[i-1];
data[i-1]=temp;
i--;
}
}
var stop = new Date().getTime();
var elapsed = stop - start;
console.log(data);
console.log(elapsed);
</script>
参考文章1