合并排序,将两个已经排序的数组合并成一个数组,此示例仅能合并由小到大排序的数组.
1/合并生成一个新的数组;
#include <iostream> #include <stdio.h> using namespace std; void mergeArray(int *a,int aLen,int *b,int bLen,int *c) { int len = aLen + bLen -1; //指向a数组的最后一个元素 aLen--; bLen--; while(aLen>=0&&bLen>=0) { if(a[aLen]>b[bLen]) c[len--] = a[aLen--]; else c[len--] = b[bLen--]; } while(aLen>=0) { c[len--] = a[aLen--]; } while(bLen>=0) { c[len--] = b[bLen--]; } } int main(int argc, char *argv[]) { int a[] = {1,2,3,6,17}; int b[] = {7,8,10,21}; int c[9]; mergeArray(a,5,b,4,c); return true; }
2/其中一个数组能容下两个数组的所有元素;
#include <iostream> #include <stdio.h> using namespace std; void mergeArray(int *a,int aLen,int *b,int bLen) { int len = aLen + bLen -1; //指向a数组的最后一个元素 aLen--; bLen--; while(aLen>=0&&bLen>=0) { if(a[aLen]>b[bLen]) a[len--] = a[aLen--]; else a[len--] = b[bLen--]; } while(bLen>=0) { a[len--] = b[bLen--]; } } int main(int argc, char *argv[]) { int a[] = {1,2,3,6,17,0,0,0,0}; int b[] = {7,8,10,21}; mergeArray(a,5,b,4); return true; }
3.链表合并排序,将两个数序链表组合到一个链表中
#include <iostream> #include <stdio.h> using namespace std; struct NodeL { int value; NodeL *next; NodeL(int value_=0,NodeL *next_=NULL):value(value_),next(next_){} }; NodeL *MergeList(NodeL *head1,NodeL *head2) { if(head1==NULL) return head2; if(head2==NULL) return head1; NodeL *head = NULL; if(head1->value<head2->value) { head = head1; head1 = head1->next; } else { head = head2; head1 = head2->next; } NodeL *tmpNode = head; while(head1&&head2) { if(head1->value<head2->value) { head->next = head1; head1 = head1->next; } else { head->next = head2; head2 = head2->next; } head = head->next; } if(head1) { head->next = head1; } if(head2) { head->next = head2; } return tmpNode; } void test() { NodeL *head1 = new NodeL(1); NodeL *cur = head1; for(int i=1;i<5;i++) { NodeL *tmpNode = new NodeL(i); cur->next = tmpNode; cur = cur->next; } NodeL *head2 = new NodeL(2); cur = head2; for(int i=11;i<35;i+=2) { NodeL *tmpNode = new NodeL(i); cur->next = tmpNode; cur = cur->next; } NodeL *head = MergeList(head1,head2); NodeL *headDelete = head; while(head) { cout<<head->value<<" "; head = head->next; } NodeL *tmp; while(headDelete) //没有它是会内存泄漏的 { tmp = headDelete; headDelete = headDelete->next; delete tmp; } } int main() { test(); return 0; }
检验一个数组是否是按序排列
#include <iostream> using namespace std; int IsOrder(int num[],int lenth) { if(lenth == 1) return 1; int k=0; for(int i=0;i<lenth-1;i++) { if(num[i]<num[i+1]) { if(0==k) { k=1; } else if(-1==k) return 0; } else if(num[i]>num[i+1]) { if(0==k) { k=-1; } else if(1==k) { return 0; } } } if (0==k) { return 1; } return k; } int main() { int a[]={1,1,2,3,4,5,8,9}; int b[]={1,1,2,3,4,5,8,3}; int c[]={5,4,3,2,1,0,0}; cout<<IsOrder(a,8)<<endl; cout<<IsOrder(b,8)<<endl; cout<<IsOrder(c,7)<<endl; }