算法学习——单链表快排

简介:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/**
      * 以p为轴对start-end间的节点进行快排(包括start && 不包括end);
      * 思路:
      * 1.将头节点作为轴节点start,从start.next开始遍历,如果节点小于轴start的值,将该节点插入到轴节点后面;
      * 2.将轴节点插入合适位置,即找到最后一个小于轴的节点,将该节点与轴节点值互换,此时就链表分为两部分,小于轴节点和大于轴节点;
      * 3.递归的遍历2中两部分节点。
     
      * @param p
      * @param start
      * @param end
      */
     private  static  void  quickSortWithLinkedList(Node start, Node end) {
 
         if  (start ==  null  || start == end) {
             return ;
         }
         Node last = start;
         Node cur = start.next;
         
         Node next ;
 
         // 1.默认start作为轴,如果index比start小则移动到start的next
         while  (cur !=  null  && cur != end) {
             next = cur.next;
             if  (cur.value <= start.value) {
                 if  (start != last) { //为了防止第一个元素小于轴时发生的重复引用
                     last.next = next;
                     Node startNext = start.next;
                     start.next = cur;
                     cur.next = startNext;
                     cur = next;
                 } else {
                     last = cur;
                     cur = cur.next;
                 }
             else  {
                 last = cur;
                 cur = cur.next;
             }
         }
         // 2.将轴移动到合适的位置,与小于轴的节点的值互换
         Node newIndex = start.next;
         last = start;
         // 找到轴插入的位置last,即找到最后一个小于轴的节点;newIndex != end是为了防止将end加入到计算范围中
         while  (newIndex !=  null  && newIndex != end && newIndex.value <= start.value) {
             last = newIndex;
             newIndex = newIndex.next;
         }
         //
         // 将轴与插入位置上节点的值进行交换
         int  temp = last.value;
         last.value = start.value;
         start.value = temp;
         // 3.进行下一次迭代
         quickSortWithLinkedList(start, last);
         quickSortWithLinkedList(last.next, end);
     }























本文转自wauoen51CTO博客,原文链接:http://blog.51cto.com/7183397/1967055  ,如需转载请自行联系原作者

相关文章
|
22天前
|
存储 算法 索引
数据结构与算法:单链表
朋友们大家好,本节来到数据结构与算法的新内容:单链表 在上篇文章中,我们知道顺序表通常需要预分配一个固定大小的内存空间, 通常以二倍的大小进行增容,可能会造成空间的浪费,本篇文章我们介绍的链表可以解决这个问题
|
2天前
|
存储 算法
单链表——“数据结构与算法”
单链表——“数据结构与算法”
|
2天前
|
机器学习/深度学习 算法 前端开发
Scikit-learn进阶:探索集成学习算法
【4月更文挑战第17天】本文介绍了Scikit-learn中的集成学习算法,包括Bagging(如RandomForest)、Boosting(AdaBoost、GradientBoosting)和Stacking。通过结合多个学习器,集成学习能提高模型性能,减少偏差和方差。文中展示了如何使用Scikit-learn实现这些算法,并提供示例代码,帮助读者理解和应用集成学习提升模型预测准确性。
|
2天前
|
机器学习/深度学习 算法 Python
使用Python实现集成学习算法:Bagging与Boosting
使用Python实现集成学习算法:Bagging与Boosting
15 0
|
16天前
|
算法 C语言
【算法与数据结构】 C语言实现单链表队列详解2
【算法与数据结构】 C语言实现单链表队列详解
|
16天前
|
存储 算法 C语言
【算法与数据结构】 C语言实现单链表队列详解1
【算法与数据结构】 C语言实现单链表队列详解
|
1月前
|
Rust Dart 算法
55.3k star!开源算法教程,附带动画图解,学习算法不再苦恼!
55.3k star!开源算法教程,附带动画图解,学习算法不再苦恼!
|
1月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
|
1月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Canny边缘检测算法
Opencv(C++)学习系列---Canny边缘检测算法
|
1月前
|
算法 Java 索引
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
31 0