快速排序的最坏运行情况是 O(n?),比如说顺序数列的快排 。但它的平摊期望时间是 O(nlogn) , 且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多 。所以 , 对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序 。
1. 算法步骤
从数列中挑出一个元素,称为 "基准"(pivot);
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边) 。在这个分区退出之后 , 该基准就处于数列的中间位置 。这个称为分区(partition)操作;
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
2. 动图演示
代码实现JavaScript实例functionquickSort ( arr ,left ,right ){
varlen=arr. length,
partitionIndex ,
left=typeofleft!='number'?0:left ,
right=typeofright!='number'?len-1:right ;
if( left
JAVA归并排序算法,有两行代码看不懂以var a = [4,2,6,3,1,9,5,7,8,0];为例子 。
1.希尔排序 。希尔排序是在插入排序上面做的升级 。是先跟距离较远的进行比较的一些方法 。
function shellsort(arr){var i,k,j,len=arr.length,gap = Math.ceil(len/2),temp;while(gap0){for (var k = 0; kgap; k++) {var tagArr = [];tagArr.push(arr[k])for (i = k+gap; ilen; i=i+gap) {temp = arr[i];tagArr.push(temp);for (j=i-gap; j -1; j=j-gap) {if(arr[j]temp){arr[j+gap] = arr[j];}else{break;}}arr[j+gap] = temp;}console.log(tagArr,"gap:"+gap);//输出当前进行插入排序的数组 。console.log(arr);//输出此轮排序后的数组 。}gap = parseInt(gap/2);}return arr;}
过程输出:
[4, 9] "gap:5"[4, 2, 6, 3, 1, 9, 5, 7, 8, 0][2, 5] "gap:5"[4, 2, 6, 3, 1, 9, 5, 7, 8, 0][6, 7] "gap:5"[4, 2, 6, 3, 1, 9, 5, 7, 8, 0][3, 8] "gap:5"[4, 2, 6, 3, 1, 9, 5, 7, 8, 0][1, 0] "gap:5"[4, 2, 6, 3, 0, 9, 5, 7, 8, 1][4, 6, 0, 5, 8] "gap:2"[0, 2, 4, 3, 5, 9, 6, 7, 8, 1][2, 3, 9, 7, 1] "gap:2"[0, 1, 4, 2, 5, 3, 6, 7, 8, 9][0, 1, 4, 2, 5, 3, 6, 7, 8, 9] "gap:1"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
由输出可以看到 。第一轮间隔为5 。依次对这些间隔的数组插入排序 。
间隔为5:
[4, 9] "gap:5"[4, 2, 6, 3, 1, 9, 5, 7, 8, 0][2, 5] "gap:5"[4, 2, 6, 3, 1, 9, 5, 7, 8, 0][6, 7] "gap:5"[4, 2, 6, 3, 1, 9, 5, 7, 8, 0][3, 8] "gap:5"[4, 2, 6, 3, 1, 9, 5, 7, 8, 0][1, 0] "gap:5"[4, 2, 6, 3, 0, 9, 5, 7, 8, 1][4, 6, 0, 5, 8] "gap:2"[0, 2, 4, 3, 5, 9, 6, 7, 8, 1][2, 3, 9, 7, 1] "gap:2"[0, 1, 4, 2, 5, 3, 6, 7, 8, 9][0, 1, 4, 2, 5, 3, 6, 7, 8, 9] "gap:1"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
间隔为2:
[4, 2, 6, 3, 0, 9, 5, 7, 8, 1]4605823971
排序后:
[0, 1, 4, 2, 5, 3, 6, 7, 8, 9]
间隔为1:
排序后:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 。
2.快速排序 。把一个数组以数组中的某个值为标记 。比这个值小的放到数组的左边,比这个值得大的放到数组的右边 。然后再递归 对左边和右边的数组进行同样的操作 。直到排序完成 。通常以数组的第一个值为标记 。
代码:
function quickSort(arr){var len = arr.length,leftArr=[],rightArr=[],tag;if(len2){return arr;}tag = arr[0];for(i=1;ilen;i++){if(arr[i]=tag){leftArr.push(arr[i])}else{rightArr.push(arr[i]);}}return quickSort(leftArr).concat(tag,quickSort(rightArr));}
3.归并排序 。把一系列排好序的子序列合并成一个大的完整有序序列 。从最小的单位开始合并 。然后再逐步合并合并好的有序数组 。最终实现归并排序 。
合并两个有序数组的方法:
function subSort(arr1,arr2){var len1 = arr1.length,len2 = arr2.length,i=0,j=0,arr3=[],bArr1 = arr1.slice(),bArr2 = arr2.slice();while(bArr1.length!=0 || bArr2.length!=0){if(bArr1.length == 0){arr3 = arr3.concat(bArr2);bArr2.length = 0;}else if(bArr2.length == 0){arr3 = arr3.concat(bArr1);bArr1.length = 0;}else{if(bArr1[0]=bArr2[0]){arr3.push(bArr1[0]);bArr1.shift();}else{arr3.push(bArr2[0]);bArr2.shift();}}}return arr3;}
- java查询数组中是否包含某一个值 javamongodb数组查询
- mysql 快速查询 mysql快速匹配
- redis实战电子书 redisjava书籍
- 如何快速找到戴尔PE服务器? 戴尔服务器PE怎么近
- javaredis集群 javaredis列队
- Redis队列排队 redis队列java
- springboot整合mongodb查询 springmongodb数值排序
- 查询所有部门信息和部门人数并按人数从多到少排序 查询各部门大于mysql
- 吃避孕药后小腹 mysql数字格式排序
- java mongodb aggregate mongodb的教程java
