排序算法解析--冒泡排序、快速排序

时间复杂度是度量算法执行的时间长短,而空间复杂度是度量算法所需存储空间的大小。

算法的时间复杂度记做:T(n)=O(f(n))

在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出T(n)的同数量级(它的同数量级有以下:1、Log2n、n、nLog2n、n的平方、n的三次方、2的n次方、n!),找出后,f(n)=该数量级,如冒泡排序的时间复杂度为T(n)=O(n*n)。

冒泡(Bubble)排序

冒泡排序(BubbleSort)的基本思想是:依次比较相邻的两个数,将小数放在前面,大数放在后面。如此重复下去,直至最终完成排序。

时间复杂度为O(n*n),适用于排序小列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var arr = [3,1,4,2,5,21,6,15,63];
function sortA(arr){
for(var i=0;i<arr.length-1;i++){
for(var j=i+1;j<arr.length;j++){
//获取第一个值和后一个值比较
var cur = arr[i];
if(cur>arr[j]){
// 因为需要交换值,所以会把后一个值替换,我们要先保存下来
var index = arr[j];
// 交换值
arr[j] = cur;
arr[i] = index;
}
}
}
return arr;
}

快速排序

快速排序(Quicksort)是对冒泡排序的一种改进,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

时间复杂度为O(nlog2n),适用于排序大列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var arr = [3,1,4,2,5,21,6,15,63];
function sortA(arr){
// 如果只有一位,就没有必要比较
if(arr.length<=1){
return arr;
}
// 获取中间值的索引
var len = Math.floor(arr.length/2);
// 截取中间值
var cur = arr.splice(len,1);
// 小于中间值放这里面
var left = [];
// 大于的放着里面
var right = [];
for(var i=0;i<arr.length;i++){
// 判断是否大于
if(cur>arr[i]){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
// 通过递归,上一轮比较好的数组合并,并且再次进行比较。
return sortA(left).concat(cur,sortA(right));
}