快速排序
下面是之前实现过的快速排序的代码。
function quickSort(a,left,right){if(left&#61;&#61;right)return;let key&#61;partition(a,left,right);//选出key下标if(left<key){quickSort(a,left,key-1);//对key的左半部分排序
}if(key<right){quickSort(a,key&#43;1,right)//对key的右半部份排序
}
}
function partition(a,left,right){let key&#61;a[left];//一开始让key为第一个数while(left
}return left;//把key现在所在的下标返回
}
明显我们可以看出快排的思想是每次找到一个基准数&#xff0c;将数组排列成基准数左边的每个数都比基准数大&#xff0c;右边的每个数都比基准数小的序列。 通过这个思想&#xff0c;我们可以稍微修改QuickSort函数&#xff0c;使它变成findKmax函数&#xff0c;使之拥有快速查找前k个最大的数。
基于快速排序思想查找第K大的数
function findKmax(a,k){let left&#61;0,right&#61;a.length-1;let key&#61;partition(a,left,right);let len&#61;a.length-key;while(len!&#61;k){if(len>k){key&#61;partition(a,key&#43;1,right);}else{key&#61;partition(a,left,key-1);}len&#61;a.length-key;}return a[key];
}
function partition(a,left,right){let key&#61;a[left];//一开始让key为第一个数while(left
}return left;//把key现在所在的下标返回
}
重点是要注意判定边界条件&#xff0c;left,right,k三个都在变&#xff0c;因此需要检验
同理&#xff0c;还可以求第K小的数
function findKmin(a,k){//查找第K小的数let left&#61;0,right&#61;a.length-1;let key&#61;partition(a,left,right);while(key!&#61;k-1){if(key>k-1){key&#61;partition(a,left,key-1);}else{key&#61;partition(a,key&#43;1,right);}}return a[key];
}
function partition(a,left,right){let key&#61;a[left];//一开始让key为第一个数while(left
}return left;//把key现在所在的下标返回
}