数组&链表 快速排序
来源:互联网 发布:淘宝最近查的严 编辑:程序博客网 时间:2024/05/15 05:14
数组&链表 快速排序
关于思想以及代码别的博客太多了,不做冗余的介绍。
对于数组
public void sort(int[] array, int beg, int end) { int index = partition(array, beg, end); //哨兵是也 sort(array, beg, index - 1); //哨兵左 sort(array, index + 1, end); //哨兵右分别递归sort方法 /* 要知道上面的递归写法都是针对整个数组的,对于寻找第k小的数得这么写 */ /*while (beg < end) { int index = partition(nums, beg , end); if (index > k - 1) end = index - 1; else if (index < k - 1) beg = index + 1; else break; } return nums[k - 1];*/}private int partition(int[] array, beg, end) { int key = array[beg]; //beg做关键字 while (beg < end) { while (array[end] >= key && beg < end) { end--; } array[beg] = array[end]; while (array[beg] <= key && beg < end) { beg++; } array[end] = array[beg]; } array[end] = key; return end;}
对于链表
public void sort(ListNode head, ListNode end) { if (head != end) { ListNode mid = partition(head, end); sort(head, mid); sort(mid.next, end); }}public ListNode partition(ListNode head, ListNode end) { if (head.next == null) return head; ListNode p = head; ListNode q = head.next; int key = p.val; while (q != end) { //注意这里跟数组排序有点不一样 if (q.val < key) { p = p.next; //p作为慢指针想找比key小的跟他交换,好狡猾 swap_val(p, q); } q = q.next; } swap_val(head, p); //最后把head扔到哨兵的位置 return p; //返回哨兵}
关于链表
关于链表还想说一件事——归并排序,顺便总结一下
public ListNode sortList(ListNode head) { if (head == null || head.next == null) return head; ListNode mid = getMid(head); //得到中间的函数,很关键,很机智 ListNode rHead = mid.next; mid.next = null; //把尾巴清空 return merge(sortList(head), sortList(rHead));//左半边右半边递归}private ListNode getMid(ListNode head) { if (head.next.next == null) return head; ListNode slow, fast; slow = fast = head; //快慢指针,快指针越界了就说明慢指针到正中间 while (fast.next != null && fast.next.next != null) {/*注意这里是next的next*/ slow = slow.next; fast = fast.next.next; } return slow;}private ListNode merge(ListNode head, ListNode rHead) { ListNode dummy = new ListNode(0); ListNode cur = dummy; /* 这里就相当于合并两个已排序的链表,是不是很机智? */ while (head != null && rHead != null) { if (head.val < rHead.val) { cur.next = head; head = head.next; } else { cur.next = rHead; rHead = rHead.next; } cur = cur.next; } if (head == null) { cur.next = rHead; } else cur.next = head; return dummy.next; }
0 0
- 数组&链表 快速排序
- 数组排序-快速排序
- 快速排序 Java实现-数组-链表
- 二维数组快速排序
- 数组实现快速排序
- JAVA数组快速排序
- iOS数组快速排序
- 数组快速排序,selecter
- int数组快速排序
- 数组和快速排序
- 快速排序:数组
- 快速排序 数组 单链表
- php数组快速排序
- 数组快速排序
- 数组快速排序
- 二维数组快速排序
- js数组快速排序
- 数组 冒泡排序 , 快速排序
- java day6
- POJ-Tree Summing【递归】【二叉树】【好题】
- excel的导入导出
- EFQRCode:自动生成花式二维码
- 1.helloword
- 数组&链表 快速排序
- 【网络流24题 太空飞行计划】最大权闭合子图
- (蓝桥杯第五届B组)啤酒和饮料 & 切面条 (简单题)
- redis基础学习
- vim常用命令
- android 画布,画笔,综合使用,可实现简单的画板
- iOS 高可控性日历基础组件
- ORACLE EM重建
- JAVA中浮点数的处理