单链表的快速排序
来源:互联网 发布:烟台plc编程 编辑:程序博客网 时间:2024/06/16 16:08
一般情况下快速排序采用的数据结构是数组,数组可以随机存取,如果采用单链表,由于只有一个头节点,所以和数组的快速排序有一些不一样的地方,主要还是切分的方法不同。在单链表的快速排序中,可以使用两个指针,p和q,p和q开始时都在子数组的开头,其中p=start,q=p.next。同样地,选择start节点的数值作为切分元素,需要满足以下条件:
- start和指针p之间的元素值要小于切分元素
- p和q之间的元素值要大于切分元素
- q和end之间的元素还未确定
- 当q循环到end的时候结束此子链表的循环,把指针p和指针start的元素值进行交换
代码如下:
package chapter2;import java.util.Random;/** * Created by jia on 17-5-17. */public class QuickList { class Node { int val; Node next; } Node head; int length; public QuickList() { head = new Node(); head.next = null; length = 0; } public void add(int val) { Node newNode = new Node(); newNode.val = val; newNode.next = head.next; head.next = newNode; length++; } private void swap(Node i, Node j) { //只交换两个节点的值,并不是直接交换两个节点 if (i == j) return; int temp = i.val; i.val = j.val; j.val = temp; } private Node partition(Node start, Node end) { int v = start.val; Node p = start; Node q = p.next; while (q != end) { //当发现q节点的值小于v的时候,将指针p向右循环一位,并交换p和q节点的值 if (q.val < v) { p = p.next; swap(p, q); } //q向右循环一位,直至遇到end节点 q = q.next; } //结束循环后说明已经将start和end之间的节点按照大小划分,其中节点p及p之前的元素除了start节点外都是小于v的, // 此时需要做的只是把作为枢轴的start节点和p节点交换 swap(p, start); return p; } public void sort() { sort(head.next, null); } public void sort(Node start, Node end) { if (start == end) return; Node j = partition(start, end); sort(start, j); sort(j.next, end); } public int[] toArray() { int[] a = new int[length]; Node current = head; for (int i = 0; i < length; i++) { a[i] = current.next.val; current = current.next; } return a; } public static void main(String[] args) { Random random = new Random(); QuickList list = new QuickList(); for (int i = 0; i < 100; i++) { int t = random.nextInt(10); System.out.println(t); list.add(t); } ArrayPrint.print(list.toArray()); list.sort(); ArrayPrint.print(list.toArray()); }}
阅读全文
3 1
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- 单链表的快速排序
- C++抽象编程——算法分析(8)——插入排序算法与分析
- 单例模式
- mysql存储过程传入表名做参数,进行分页处理
- 【个人笔记重点,不作为参考】主题:JSX语法与函数式编程
- xgboost特征选择
- 单链表的快速排序
- [SCOI2007]蜥蜴
- 第四单元练习题
- 关于SVN的一些概念和配置文件理解
- DOM节点操作图例
- bzoj 1014伸展树 模板题
- A*寻路 之 Layered Grid Graph
- HDU 2665 Kth number (主席树)
- 《--即时笔记--》