算法笔记 - 数组与单链表快速排序(Java)
2017-03-27 12:39
330 查看
数组快速排序
public class QuickSort { private static final int COUNT = 1000000; private static final int ZONE = 200; public static void main(String[] args){ Random rand = new Random(); Integer[] array = new Integer[COUNT]; for(int i=0;i<COUNT;i++){ array[i] = rand.nextInt(ZONE); } long startTime = System.currentTimeMillis(); quickSort(array,0,array.length-1); long endTime = System.currentTimeMillis(); float time = (endTime - startTime) / 1000F; System.out.println(time); } private static void quickSort(Integer[] array,int left,int right){ if(left>=right) return; int i = left; int j = right; int key = array[(i+j)/2]; while(i<j){ for(;i<j&&array[j]>=key;j--); array[i] = array[j]; for(;i<j&&array[i]<=key;i++); array[j] = array[i]; } array[i] = key; quickSort(array,left,i-1); quickSort(array,i+1,right); } }
单链表快速排序
public class LinkedQuickSort { private static final int COUNT = 100000; private static final int ZONE = 200; public static void main(String[] args){ Random rand = new Random(); Node node = new Node(0); Node head = node; for(int i=0;i<COUNT;i++){ node.next = new Node(rand.nextInt(ZONE)); node = node.next; } long startTime = System.currentTimeMillis(); quickSort(head.next); long endTime = System.currentTimeMillis(); float time = (endTime - startTime) / 1000F; System.out.println(time); for(head=head.next;head!=null;head=head.next){ System.out.print(head.val+" "); } } private static Node quickSort(Node head){ if(head == null || head.next == null) return head; Node left = new Node(0); Node middle = new Node(0); Node right = new Node(0); Node leftHead = left; Node middleHead = middle; Node rightHead = right; int val = head.val; for(;head!=null;head=head.next){ if(head.val<val){ left.next = head; left = left.next; }else if(head.val>val){ right.next = head; right = right.next; }else{ middle.next = head; middle = middle.next; } } left.next = null; middle.next = null; right.next = null; return merge(quickSort(leftHead.next),middleHead.next,quickSort(rightHead.next)); } private static Node merge(Node left, Node middle, Node right) { Node leftTail = findTail(left); Node middleTail = findTail(middle); middleTail.next = right; if(left!=null){ leftTail.next = middle; return left; }else{ return middle; } } private static Node findTail(Node node){ Node tail = node; if(tail != null){ while(tail.next!=null){ tail = tail.next; } } return tail; } } class Node{ int val; Node next; public Node(int val) { this.val = val; } }
相关文章推荐
- java笔记之数组的概念、声明、初始化、访问方式、复制和动态扩展算法以及递归
- 算法(第四版)学习笔记之java实现能够动态调整数组大小的栈
- Java数据结构和算法笔记_参考教材:Java数据结构和算法(第二版),[美] Robert lafore-数组
- java笔记之数组的概念、声明、初始化、访问方式、复制和动态扩展算法以及递归
- 算法笔记 - 单链表反转(Java)
- Java基础入门笔记-数组链表
- JAVA学习笔记:基础算法(附Java与C之间检查数组越界的差异)
- Java学习笔记之数组排序算法
- 算法笔记_015:快速排序(Java)
- 算法(第四版)学习笔记之java实现快速排序
- #数据结构与算法学习笔记#剑指Offer1:二维数组中的查找(JAVA)
- 数据结构与算法学习笔记——链表部分实现(数组形式)
- 【算法学习笔记】66. 模拟法 数组链表 报数优化 SJTU OJ 4010 谁最有耐心
- 算法(第四版)笔记<一>-------动态队列的数组实现(Java语言)
- java常用算法学习笔记--链表篇
- 算法(第四版)学习笔记之java实现可以动态调整数组大小的栈
- 算法笔记_133:最大连续乘积子数组(Java)
- Java基础知识强化之集合框架笔记21:数据结构之 数组 和 链表
- 算法(第四版)学习笔记之java实现栈和队列(链表实现)
- java笔记之数组的概念、声明、初始化、访问方式、复制和动态扩展算法以及递归