[JS]链表划分给定中间值,小的在左边,大的在右边并保持原排序
2017-10-06 00:00
344 查看
测试代码
<script type="text/javascript"> //产生测试数据 var head = new sNode(0); for(var i=0;i<20;i++){ var p = new sNode(randInt(100)); p.pNext = head.pNext; head.pNext = p; } print(head); for(var i=1;i<6;i++){ write("当前的中间值是: "+parseInt(50/i)); writeEnd(); head = partition(head,parseInt(50/i)); print(head); } //一次partition function partition(head,pivotKey){ var pLeftHead = new sNode(0); var pRightHead = new sNode(0); var p = head.pNext; var left = pLeftHead; var right = pRightHead; while(p!=null){ if(p.value < pivotKey){ left.pNext = p; left = p; }else{ right.pNext = p; right = p; } p = p.pNext; } right.pNext = null; left.pNext = pRightHead.pNext; head.pNext = pLeftHead.pNext; return head; } </script>
辅助函数
//定义sNode结点 function sNode(v){ this.value = v; this.pNext = null; } //遍历链表数据 function print(head){ write("输出链表数据..."); writeEnd(); var p = head.pNext; while(p!=null){ write(p.value); p = p.pNext; } writeEnd(); write("end 输出链表数据..."); writeEnd(); } //产生整型随机数 function randInt(max){ return parseInt(Math.random()*max); } //对默认的输出进行封装为write函数 function write(str){ console.log(str); document.write(str+" "); } //输出换行 function writeEnd(){ document.write("<br>"); }
测试结果
当不断地选取中间值,就有快速排序的感觉了。。。
相关文章推荐
- [JS]链表划分给定中间值,小的在左边,大的在右边并保持原排序
- [链表] - 将单向链表按某值划分成左边小、中间相等、右边大的形式
- 将单向链表按某个值划分成左边小、中间相等、右边大的形式 Python 版
- 将单向链表按某值划分成左边小,中间相等,右边大
- 将单向链表按某值划分成左边小、 中间相等、 右边大的形式~迎娶是挺
- C++将链表划分为左边小,中间等,右边大于pivotKey的形式
- 这是一个我面试某公司的算法题目:对一个字符数组进行排序,根据给定的字符,大于它的,放在数组的左边,小于它的,放在数组的右边,且数组中的元素之间的相对位置要保持不变。
- 将单向链表按某值划分成左边小、中间相等、右边大的形式
- 链表问题---将单向链表按某值划分成左边小,中间相等,右边大的形式
- Java——将单向链表按某值划分成左边小、中间相等、右边大的形式(进阶问题)
- 将单向链表按某值划分成左边小、中间相等、右边大的形式
- Java——将单向链表按某值划分成左边小、中间相等、右边大的形式(基础问题)
- C++链表划分左边小中间等右边大 时间复杂度O(n) 空间复杂度O(1)
- 划分一个整形数组,把负数放在左边,零放在中间,正数放在右边
- 字符串重新排序,数字字符移到右边,字母字符移到左边,保持字符在原字符串中的前后顺序不变
- 把单链表按某值划分成左边小,中间相等,右边大的形式,时间O(n),空间O(1)
- 据说是淘宝面试题“给定一个数组将大于0的放在最右边,等于0的放在中间,大于0的放在最左边”
- POJ1577 二叉树的创建及先序遍历(给定一些二叉树中的值,大于根的排在右边,小于根的排在左边)
- 链表之交换奇偶数,实现左边为奇数,右边为偶数
- 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数