编程练习:合并两个数组(包括三种快排程序)
2016-09-29 16:43
393 查看
#include <stdio.h> #include <stdlib.h> /*确定快排1的分界值*/ int partition1(int array[],int r,int m){ int i,j=m,temp,flag1=0,flag2=0;//比较的数是大数时将flag1置1,也就是当遇到大数之后,再次遇到小数才进行前后交换; //flag2为0时,j=i,第一次遇到大数时,把flag2置1;也就是说,j的初始值为参考值的坐标, //当遇到大数时,j的值改变为第一个大数的坐标(j=i),后续j的值的变化仅跟是否发生交换有关 if(r<m){ for(i=r;i<m;i++){ if(array[i]>array[m]){ flag1=1; if(!flag2) { j=i; flag2=1; } } else{ if(flag1){ temp=array[i]; array[i]=array[j]; array[j]=temp; j++; } } } temp=array[j]; array[j]=array[m]; array[m]=temp; return j; } } /*快排1,以最后一个数作为参考值*/ void sort1(int array[],int r,int m){ int p; if(r<m){ p=partition1(array,r,m); sort1(array,r,p-1); sort1(array,p+1,m); } } /*确定快排2的分界值*/ int partition2(int array[],int r,int m){ int i,j=m+1,temp,flag1=0,flag2=0;//比较的数是大数时将flag1置1,也就是当遇到大数之后,再次遇到小数才进行前后交换; //flag2为0时,j=i,第一次遇到大数时,把flag2置1;也就是说,j的初始值为参考值的坐标, //当遇到大数时,j的值改变为第一个大数的坐标(j=i),后续j的值的变化仅跟是否发生交换有关 if(r<m){ for(i=r+1;i<=m;i++){ if(array[i]>array[r]){ flag1=1; if(!flag2) { j=i; flag2=1; } } else{ if(flag1){ temp=array[i]; array[i]=array[j]; array[j]=temp; j++; } } } temp=array[j-1]; array[j-1]=array[r]; array[r]=temp; return j-1; } } /*快排2*/ void sort2(int array[],int r,int m){ int p; if(r<m){ p=partition2(array,r,m); sort2(array,r,p-1); sort2(array,p+1,m); } } /*快排3*/ void sort3(int array[],int r,int m){ int low=r,high=m,key=array[r]; if(low<high){ while(low<high){ while(low<high&&array[high]>key) high--; array[low]=array[high]; while(low<high&&array[low]<=key) low++; array[high]=array[low]; } array[low]=key; sort3(array,r,low-1); sort3(array,low+1,m); } } int main(int argc, char *argv[]) { int i,j,k,m,n,A[500],B[500],C[1000]; scanf("%d",&m); for(i=0;i<m;i++) scanf("%d",&A[i]); scanf("%d",&n); for(j=0;j<n;j++) scanf("%d",&B[j]); i=j=0; /*合并两个有序的数组*/ // for(k=0;k<m+n;k++){ // if(i>=m&&j<n){ // C[k]=B[j]; // j++; // } // if(j>=n&&i<m){ // C[k]=A[i]; // i++; // } // if(i<m&&j<n){ // if(A[i]<B[j]){ // C[k]=A[i]; // i++; // } // else{ // C[k]=B[j]; // j++; // } // } // } /*合并两个无序的数组*/ for(k=0;k<m+n;k++){ if(i<m){ C[k]=A[i]; i++; } else{ C[k]=B[j]; j++; } } //sort1(C,0,m+n-1); //sort2(C,0,m+n-1); sort3(C,0,m+n-1); //打印合并后的有序数组 for(k=0;k<m+n;k++) printf("%d ",C[k]); printf("\n"); return 0; }
相关文章推荐
- 编程分别输入两个按从小到大排序的数组a和b,将这两个有序数组合并,使合并后的数组仍有序 (从小到大)
- C语言之数组设数组a包括10个整型元素,用C语言编程序,求出数组a中相邻两个元素的和,并将这些和存在数组b中,按每行3个元素的形式输出。
- Java程序练习-合并两个单链表
- 编写一个程序,输入两个包含 5 个元素的数组,先将两个数组升序排序,然 后将这两个数组合并成一个升序数组(合并排序)。
- 171122—数组程序练习(排序并输出下标&两个数组按顺序排成一个)
- java 合并两个数组 三种解法
- JS编程——合并两个有序数组
- 网新恒天笔试题,有两个整形数组A和B,请编程去除这两个数组间的交集。若有相同元素,则在相同元素较多的数组中保留它。例如,数组A有三个1,数组B有两个1,程序将删除数组B中的两个1.
- 第6章_数组_编程练习_Exercise6_5
- C语言:编程练习参考程序
- .net 合并两个数组为一个新的数组,两数组中相同的数据只存在一个
- 已知m和n是已经排序好的数组,从小到大,现在要合并这两个数组内的数到一个数组,仍然要求是从小到大排序
- 收集两个C++写的从文本文件中读取数据保存到数组的程序
- 编程练习——求无序数组第k小的数
- 算法:给定两个已从小到大排好序的整型数组arrA和arrB,将两个数组合并成arrC,使得arrC也要按从小到大的顺序排好序
- 编程练习-螺旋数组
- Win32编程基础知识(包括对程序的分析)
- 郭克华手机编程教学视频----我的练习源码(6)实战:实现一个简单的监听程序
- 两个有序数组合并为一个有序数组
- 两个数组合并