当前位置:   article > 正文

JAVA实现单链表快速排序_java单链表快速排序

java单链表快速排序

链表与数组排序的不同在于,数组里通过下标交换的开销是O(1)的,而链表是O(n)的。所以,直接照搬数组的快速排序到链表,速度会很慢。

但是链表有一个优点,就是把元素移动到尾部,时间是O(1)的。

思路如下:

将链表的第一个元素设置为pivot,遍历之后的n-1个元素,如果该元素的值大于pivot,则将其放在链表末尾(O(1)时间)。遍历所需时间是O(n)的。遍历之后,数组分为三个部分:【pivot】【比pivot小的元素】【比pivot大的元素】,将pivot插入后两部分中间,得到:【比pivot小的元素】【pivot】【比pivot大的元素】,此时,就可以对前后两部分进行递归了。算法复杂度为O(nlog(n))。

注意:quick_sort的三个参数分别为:start_pre,指向第一个元素的Node(即start_pre.next=start),len是链表的长度,end是尾指针(注意,end.next不一定为null)



  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;
  4. public class LinkListSort {
  5. public static int [] random_order_array(int len){
  6. List <Integer> list = new ArrayList<Integer>();
  7. for (int i = 0; i < len; i ++){
  8. list.add(i);
  9. }
  10. Collections.shuffle(list);
  11. int [] array = new int [len];
  12. for (int i = 0; i < len; i ++)
  13. array[i] = list.get(i);
  14. return array;
  15. }
  16. public static void print_mynode(MyNode node, int len){
  17. MyNode temp = node;
  18. for (int i = 0; i < len; i ++){
  19. System.out.print(temp.val + " ");
  20. temp = temp.next;
  21. }
  22. System.out.println();
  23. }
  24. public static void quiksort(MyNode start_pre, int len, MyNode end){
  25. if (len <= 1)
  26. return;
  27. MyNode start = start_pre.next;
  28. int pivot_val = start.val;
  29. int split_position = 0;
  30. MyNode temp0 = start;
  31. MyNode temp1 = start.next;
  32. for (int i = 1; i < len; i ++){
  33. if (temp1.val > pivot_val){ //放到链表末尾
  34. if (temp1 != end){
  35. temp0.next = temp1.next;
  36. temp1.next = end.next;
  37. end.next = temp1;
  38. end = temp1;
  39. temp1 = temp0.next;
  40. }
  41. }
  42. else{
  43. temp1 = temp1.next;
  44. temp0 = temp0.next;
  45. split_position ++;
  46. }
  47. }
  48. MyNode pivot_node = start;
  49. if (temp0 != start){
  50. start_pre.next = pivot_node.next;
  51. temp0.next = pivot_node;
  52. pivot_node.next = temp1;
  53. }
  54. quiksort(start_pre, split_position, temp0);
  55. quiksort(pivot_node, len - split_position - 1, end);
  56. }
  57. public static void main(String [] args){
  58. int len = 20;
  59. int [] array = random_order_array(len);
  60. //int [] array = {0, 3, 2, 8, 6, 9, 7, 5, 1, 4 };
  61. //int [] array = {3, 2, 8, 6, 9, 7, 5, 1, 4 };
  62. MyNode start = new MyNode(array[0]);
  63. MyNode temp = start;
  64. for (int i = 1; i < array.length; i ++){
  65. temp.next = new MyNode(array[i]);
  66. temp = temp.next;
  67. }
  68. MyNode end = start;
  69. for (int i = 0; i < len - 1; i ++){
  70. end = end.next;
  71. }
  72. MyNode start_pre = new MyNode(-1);
  73. start_pre.next = start;
  74. System.out.println("乱序数组:");
  75. print_mynode(start_pre.next, len);
  76. quiksort(start_pre, len, end);
  77. System.out.println("排序后数组:");
  78. print_mynode(start_pre.next, len);
  79. }
  80. }
  81. class MyNode{
  82. int val;
  83. MyNode next = null;
  84. public MyNode(int val){
  85. this.val = val;
  86. }
  87. }


输出结果举例:

乱序数组:
19 16 1 6 2 17 11 3 8 5 9 0 18 15 4 7 14 13 10 12 
排序后数组:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 












声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/449317
推荐阅读
相关标签
  

闽ICP备14008679号