单链表的排序(快排和冒泡实现)以及查找中间结点
2016-04-24 19:59
381 查看
//快排,冒泡链表排序 #include<iostream> #include<assert.h> using namespace std; template<class T> struct LinkNode { T _data; LinkNode* _next; LinkNode(const T& x) :_data(x) , _next(NULL) {} }; template<class T> class ListNode { //为了安全性 private: ListNode(const ListNode& l) {} ListNode<T>& operator=(ListNode l) {} public: //程序限制 LinkNode<T>* _head; public: ListNode() :_head(NULL) {} ~ListNode() { while (_head) { PopBack(); } } void PushBack(const T& x) { LinkNode<T>* tmp = new LinkNode<T>(x); if (_head == NULL) _head = tmp; else { LinkNode<T>* cur = _head; while (cur->_next) cur = cur->_next; cur->_next = tmp; } } void PopBack() { if (_head == NULL) return; if (_head->_next == NULL) { delete _head; _head = NULL; } else { LinkNode<T>* cur = _head; while (cur->_next&&cur->_next->_next) { cur = cur->_next; } LinkNode<T>* del = cur->_next; cur->_next = NULL; delete del; } } LinkNode<T>* Search(const T& x) { if (_head == NULL) return NULL; LinkNode<T>* cur = _head; while (cur->_data != x) cur = cur->_next; return cur; } void Print() { LinkNode<T>* cur = _head; while (cur) { cout << cur->_data << " "; cur = cur->_next; } cout << endl; } }; template<class T> LinkNode<T>* QuickPartion(LinkNode<T>* begin,LinkNode<T>* end)//前闭后开 { if (begin== end) return begin; LinkNode<T>* prev,* cur; prev = begin; cur = begin->_next; int tmp = begin->_data; while (cur != end) { if(cur->_data < tmp) { prev = prev->_next; if (cur!=prev) swap(cur->_data, prev->_data); } cur = cur->_next; } swap(prev->_data, begin->_data); return prev; } template<class T> void QuickSort(LinkNode<T>* head,LinkNode<T>* tail) { if (head == NULL || head-== tail) return; LinkNode<T>* mid = QuickPartion(head, tail); QuickSort(head, mid); QuickSort(mid->_next, tail); } template<class T> void BubbleSort(LinkNode<T>* head) { if (head == NULL || head->_next == NULL) return; LinkNode<T>* start = head; LinkNode<T>* end = NULL; LinkNode<T>* curBegin = NULL; int flag = 0; while (start->_next) { curBegin = start; flag = 0; while (curBegin->_next != end) { if (curBegin->_data > curBegin->_next->_data) { swap(curBegin->_data, curBegin->_next->_data); flag = 1; } curBegin = curBegin->_next; } if (flag == 0) break;//优化,若有序,直接跳出 end = curBegin; } } template<class T> LinkNode<T>* SearchMidNode(LinkNode<T>* head) { if (head == NULL || head->_next == NULL) return head; LinkNode<T>* slow = head; LinkNode<T>* fast = head; while (fast&&fast->_next)//偶数个数中间任意一个 //while (fast&&fast->_next&&fast->_next->_next)//偶数个数找到中间的第一个 { fast = fast->_next->_next; slow = slow->_next; } return slow; } void Test1() { ListNode<int> l1; l1.PushBack(10); l1.PushBack(9); l1.PushBack(8); l1.PushBack(7); l1.PushBack(6); l1.PushBack(6); l1.PushBack(5); l1.PushBack(9); l1.PushBack(0); l1.PushBack(1); l1.PushBack(2); /*LinkNode<int>* tail = NULL; QuickSort(l1._head,tail);*/ //BubbleSort(l1._head); cout << SearchMidNode(l1._head)->_data<< endl; l1.Print(); }
相关文章推荐
- 在命令行用 sort 进行排序
- 文件遍历排序函数
- C#选择排序法实例分析
- C#插入法排序算法实例分析
- C#实现Datatable排序的方法
- SQLSERVER的排序问题结果不是想要的
- Windows Powershell排序和分组管道结果
- C#通过IComparable实现ListT.sort()排序
- C#定义并实现单链表实例解析
- C#数据结构之单链表(LinkList)实例详解
- C#选择法排序实例分析
- SQL学习笔记四 聚合函数、排序方法
- C#对list列表进行随机排序的方法
- jQuery拖动元素并对元素进行重新排序
- 将MySQL查询结果按值排序的简要教程
- 一根网线内的8根线哪4根是传输数据的,哪四根是防干扰的
- C语言实现选择排序、冒泡排序和快速排序的代码示例
- C#折半插入排序算法实现方法
- SQL进行排序、分组、统计的10个新技巧分享
- 简单了解C语言中直接插入排序与直接选择排序实现