归并排序--数组和链表的实现
2013-03-12 17:01
375 查看
数组实现
链表实现
/* **归并排序三步走:1 分割子问题;2 递归;3 合并子问题。 */ #include "stdafx.h" #include <iostream> using namespace std; void mergeArray(int *a, int begin1, int length1, int begin2, int length2) { int length = length1 + length2; int begin = begin1; int *b = new int[length]; int pos = 0; int cur1 = begin1; int cur2 = begin2; while((cur1 - begin1 + 1) <= length1 && (cur2 - begin2 + 1) <= length2) { if(a[cur1] <= a[cur2]) { b[pos] = a[cur1]; cur1++; pos++; } else { b[pos] = a[cur2]; cur2++; pos++; } } //前半段的数组已经合并完毕,可以直接将后半段的数组复制到数据b if((cur1 - begin1 + 1) > length1) { while((cur2 - begin2 + 1) <= length2) { b[pos] = a[cur2]; cur2++; pos++; } } else if((cur2 - begin2 + 1) > length2) { while((cur1 - begin1 + 1) <= length1) { b[pos] = a[cur1]; cur1++; pos++; } } //将合并后的数组b复制给数据a for(int i = 0; i < length; i++) { a[begin] = b[i]; begin++; } } void mergeSort(int *a, int left, int right) { if(left >= right) return; int mid = left + (right - left)/2; mergeSort(a, left, mid); mergeSort(a, mid+1, right); int length1 = mid - left + 1; int length2 = right -(mid + 1) + 1; mergeArray(a, left, length1, mid + 1, length2); } int _tmain(int argc, _TCHAR* argv[]) { int a[5] = {3, 5, 1, 2, 7}; //int a[5] = {1,1,2,1,1}; mergeSort(a, 0, 4); for(int i = 0; i < 5; i++) { cout<<a[i]<<" "; } getchar(); return 0; }
链表实现
struct node { int data; node * next; }; /* **对两个有序链表进行归并 */ node *MergeList(node *head1, node *head2) { node * tmp; if(head1 == NULL) return head2; if(head2 == NULL) return head1; if(head1->data < head2->data) { tmp = head1; head1 = head1->next; } else { tmp = head2; head2 = head2->next; } tmp->next = MergeList(head1, head2); return tmp; } /* **归并排序,参数为要排序的链表的头结点,函数返回值为排序后的链表的头结点 */ node *MergeSort(node *head) { if(head == NULL) return 0; node * r_head = head; node *head1 = head; node* head2 = head; while(head2->next != NULL && head2->next ->next!= NULL) { head1 = head1->next; head2 = head2->next->next; } if(head1->next == NULL)/*说明只有一个节点,则返回该节点*/ return r_head; head2 = head1->next; head1->next = NULL; head1 = head; /*函数MergeList是对两个有序链表进行归并,返回值是归并后的链表的头结点*/ r_head = MergeList(MergeSort(head1), MergeSort(head2)); return r_head; }
相关文章推荐
- C++:探究纯虚析构函数以及实现数组的快速排序与链表的归并排序
- 数组及链表的归并排序(C++实现)
- LeetCode.23 Merge k Sorted Lists (对数组链表进行合并,归并排序 && 或者使用PriorityQueue实现)
- 分别用数组和链表实现堆栈(C语言版)
- 以链表和数组实现并归排序的区别
- C++ HOJ 约瑟夫问题 的 数组、链表及STL实现
- Josephu 问题:数组实现和链表实现
- "《算法导论》之‘线性表’":基于数组实现的单链表
- 数组的链表实现:创建(头插/尾插)、打印、删除、插入
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- Java链表与数组实现栈
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- C++用数组和链表分别实现Stack
- 紧凑的多重数组的静态双向链表实现
- 分别用数组和链表实现堆栈(C语言版) - ahljjun的专栏 - 博客频道 - CSDN.NET
- 用数组实现链表
- C++实现队列--数组实现和链表实现
- 数据结构之用数组和链表实现栈
- 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
- 数据结构栈和队列的数组实现和链表实现的4个头文件(完全个人思路)