最近需要写一个排序算法,很久没写发现有些生疏了,抽时间用JavaScript实现了几种常用的排序算法,以备不时之需。
一、快速排序
步骤:
- 在数据集之中,选择一个元素作为”基准”(pivot)。
- 所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。
- 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
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 26 27 28 29
|
var count = 0; var arr = [55,1,22,77,99,11,88,33,66,44]; function quickSort(arr){ if (arr.length <= 1) { return arr; } var left = []; var right = []; var pivot = arr[0]; var len = arr.length; for(var i=1;i<len;i++){ var item = arr[i]; item>pivot ? right.push(item) : left.push(item); count++; } return quickSort(left).concat([pivot],quickSort(right)); } console.log(quickSort(arr)); console.log(count);
|
二、插入排序
步骤:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果被扫描的元素(已排序)大于新元素,将该元素后移一位
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤2~5
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 26 27 28 29 30 31 32 33 34 35
|
var count = 0; var arr = [55,1,22,77,99,11,88,33,66,44]; function insertSort(arr){ var sorted = []; sorted.push(arr[0]); var len = arr.length; for(var i= 1;i<len;i++){ var item = arr[i]; var flag = true; var j = sorted.length-1; for(j;j>=0;j--){ if(item>sorted[j]){ sorted.splice(j+1,0,item); flag = false; break } count++; } if(flag){sorted.splice(0,0,item);} } return sorted; } console.log(insertSort(arr)); console.log(count);
|
排序演示:
三、冒泡排序
步骤:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对第0个到第n-1个数据做同样的工作。这时,最大的数就“浮”到了数组最后的位置上。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
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 count = 0; var arr = [55,1,22,77,99,11,88,33,66,44]; function bubbleSort(arr){ var len = arr.length; var temp= []; for(var i=0;i<len;i++){ for(var j=0;j<len-i-1;j++){ if(arr[j]>arr[j+1]){ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1]= temp; } count++; } } return arr; } console.log(bubbleSort(arr)); console.log(count);
|
四、时间复杂度
来自于这里
留言
欢迎交流想法。留言会通过 GitHub Issues 保存,首次使用需要登录 GitHub。