程序员面试金典: 9.11 排序与查找 11.1给定两个排序后的数组A和B,其中A的末端有足够的缓冲容纳B。编写一个方法,将B合入A并排序。
2017-01-11 22:05
477 查看
#include <iostream> #include <stdio.h> using namespace std; /* 问题:给定两个排序后的数组A和B,其中A的末端有足够的缓冲容纳B。编写一个方法,将B 合入A并排序。 分析:排序分为:比较排序,插入排序,归并排序,快速排序,堆排序等。 比较排序:通过元素之间两两比较进行排序,典型的有:冒泡排序,堆排序 插入排序:找到待排序的位置,将选择好的值插入该位置。典型的有:简单选择排序,从数组中选则最小的放在第一位,从剩余2~n位中选择次最小放在第二位等 由于两个数组都是排好序的,与其将两个数组依次从前向后比较,每次找到数组A中待插入位置,需要将A中带插入位置及其之后元素全部后移一位,倒不如将两个 数组都从最后面开始遍历,两两比较元素,找到最大的元素放在两个数组长度之和的位置,重复上述操作。 输入: 4(数组A中的元素个数) 3(数组B中的元素个数) 1 5 7 11(数组A中元素) 2 6 12(数组B中元素) 输出: 1 2 5 6 7 11 12(输出B合并入A后的排序结果) */ const int MAXSIZE = 10000; void mergeSort(int* arrayA , int sizeA , int * arrayB , int sizeB) { if(sizeA <= 0 || sizeB <= 0 || NULL == arrayA || NULL == arrayB) { return; } int i = sizeA - 1; int j = sizeB - 1; int pos = sizeA + sizeB - 1; while(i >= 0 && j >= 0) { //比较两个元素谁大,就移动谁,并记录移动的位置 if(arrayA[i] > arrayB[j]) { //将较大的移动 arrayA[pos--] = arrayA[i]; i--; } else { arrayA[pos--] = arrayB[j]; j--; } } //说明数组A中元素全部移动完了,剩下数组B中较小的元素还没有移动,下面一次全部移动 if(j >= 0) { while(j) { arrayA[pos--] = arrayB[j--]; } } } void print(int* arrayA , int size) { if(NULL == arrayA) { return; } for(int i = 0 ; i < size ; i++) { cout << arrayA[i] << " "; } cout << endl; } void process() { int n , m; int arrayA[MAXSIZE]; int arrayB[MAXSIZE]; while(cin >> n >> m) { memset(arrayA , 0 , sizeof(arrayA)); memset(arrayB , 0 , sizeof(arrayB)); //接下来输入元素 for(int i = 0 ; i < n ; i++) { cin >> arrayA[i]; } for(int i = 0 ;i < m ; i++) { cin >> arrayB[i]; } //接下来合并排序 mergeSort(arrayA , n , arrayB , m); //然后接下来就是输出结果 print(arrayA , n + m); } } int main(int argc , char* argv[]) { process(); getchar(); return 0; }
相关文章推荐
- 【Java】两个排序后的数组A和B,其中A的末端有足够的缓冲容纳B。编写一个方法,将B合并入A并排序。
- 9.11排序与查找(一)——给定两个排序后的数组A和B,其中A的末端有足够的缓冲空间容纳B。将B合并入A并排序
- 程序员面试金典: 9.11 排序与查找 11.5有个排序后的字符串数组,其中散布这一些空字符串,编写一个方法,找出给定字符串的位置
- 9.11排序与查找(一)——给定两个排序后的数组A和B,当中A的末端有足够的缓冲空间容纳B。将B合并入A并排序
- 程序员面试金典: 9.11 排序与查找 11.1编写一个方法,对字符串数组进行排序,将所有变位词排在相邻的位置。
- 给定两个排序后的数组A和B,其中A的末端有足够的缓冲空间容纳B。将B合并入A并排序
- 给定两个排序的数组,其中A有足够空间容纳B,实现一个方法将B容纳进A并排序
- 剑指offer2.3.2字符串:有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2,编写一个函数,将A2合并到A1并排序
- 11.5 排序后的字符串数组,其中散布着空字符串,编写一个方法,找出给定字符串的位置。
- 【Java】有个排序后的字符串数组,其中散布着一些空字符串,编写一个方法,找出给定字符串的位置
- 有两个排序数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2,实现一个函数,把A2 插入到A1,并且是有序的。
- 编写一个程序,输入两个包含 5 个元素的数组,先将两个数组升序排序,然 后将这两个数组合并成一个升序数组(合并排序)。
- 9.11排序与查找(三)——给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素
- 【Java】编写一个方法,对字符串数组进行排序,将所有变位词排在相邻的位置
- 编写一个多线程函数实现对数组排序,要求: 1.至少用两个线程 2.数组的元素值可以事先定义好,或者可以从键盘输入(增加一个线程)。 3.用一个线程对数组排序,用另一个线程输出排序结果。 4.保证先排好序,再输出。
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
- 5.编写一个程序,有两个类,其中类MAX中具有两个方法,方法名都是max,一个方法能够比较两个数的大小,另外一个方法能够比较三个数的大小。在另外一个类中创建对象,调用这两个方法,分别输出两组数:2、6
- 程序员面试金典: 9.11 排序与查找 11.3找出已排序数组经过旋转后某个元素
- 怎样编写一个程序,把一个有序整数数组放到二叉树中? 编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?
- 程序员面试金典——解题总结: 9.17中等难题 17.4编写一个方法,找出两个数字中最大的那一个。不得使用if-else或其他比较运算符。