编程练习:合并两个数组(包括三种快排程序)
Posted Disen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程练习:合并两个数组(包括三种快排程序)相关的知识,希望对你有一定的参考价值。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 /*确定快排1的分界值*/ 5 int partition1(int array[],int r,int m){ 6 int i,j=m,temp,flag1=0,flag2=0;//比较的数是大数时将flag1置1,也就是当遇到大数之后,再次遇到小数才进行前后交换; 7 //flag2为0时,j=i,第一次遇到大数时,把flag2置1;也就是说,j的初始值为参考值的坐标, 8 //当遇到大数时,j的值改变为第一个大数的坐标(j=i),后续j的值的变化仅跟是否发生交换有关 9 if(r<m){ 10 for(i=r;i<m;i++){ 11 if(array[i]>array[m]){ 12 flag1=1; 13 if(!flag2) { 14 j=i; 15 flag2=1; 16 } 17 } 18 else{ 19 if(flag1){ 20 temp=array[i]; 21 array[i]=array[j]; 22 array[j]=temp; 23 j++; 24 } 25 } 26 } 27 temp=array[j]; 28 array[j]=array[m]; 29 array[m]=temp; 30 return j; 31 } 32 } 33 /*快排1,以最后一个数作为参考值*/ 34 void sort1(int array[],int r,int m){ 35 int p; 36 if(r<m){ 37 p=partition1(array,r,m); 38 sort1(array,r,p-1); 39 sort1(array,p+1,m); 40 } 41 } 42 /*确定快排2的分界值*/ 43 int partition2(int array[],int r,int m){ 44 int i,j=m+1,temp,flag1=0,flag2=0;//比较的数是大数时将flag1置1,也就是当遇到大数之后,再次遇到小数才进行前后交换; 45 //flag2为0时,j=i,第一次遇到大数时,把flag2置1;也就是说,j的初始值为参考值的坐标, 46 //当遇到大数时,j的值改变为第一个大数的坐标(j=i),后续j的值的变化仅跟是否发生交换有关 47 if(r<m){ 48 for(i=r+1;i<=m;i++){ 49 if(array[i]>array[r]){ 50 flag1=1; 51 if(!flag2) { 52 j=i; 53 flag2=1; 54 } 55 } 56 else{ 57 if(flag1){ 58 temp=array[i]; 59 array[i]=array[j]; 60 array[j]=temp; 61 j++; 62 } 63 } 64 } 65 temp=array[j-1]; 66 array[j-1]=array[r]; 67 array[r]=temp; 68 return j-1; 69 } 70 } 71 /*快排2*/ 72 void sort2(int array[],int r,int m){ 73 int p; 74 if(r<m){ 75 p=partition2(array,r,m); 76 sort2(array,r,p-1); 77 sort2(array,p+1,m); 78 } 79 } 80 81 /*快排3*/ 82 void sort3(int array[],int r,int m){ 83 int low=r,high=m,key=array[r]; 84 if(low<high){ 85 while(low<high){ 86 while(low<high&&array[high]>key) 87 high--; 88 array[low]=array[high]; 89 while(low<high&&array[low]<key) 90 low++; 91 array[high]=array[low]; 92 } 93 array[low]=key; 94 sort3(array,r,low-1); 95 sort3(array,low+1,m); 96 } 97 } 98 99 int main(int argc, char *argv[]) { 100 int i,j,k,m,n,A[500],B[500],C[1000]; 101 scanf("%d",&m); 102 for(i=0;i<m;i++) 103 scanf("%d",&A[i]); 104 scanf("%d",&n); 105 for(j=0;j<n;j++) 106 scanf("%d",&B[j]); 107 i=j=0; 108 109 /*合并两个有序的数组*/ 110 // for(k=0;k<m+n;k++){ 111 // if(i>=m&&j<n){ 112 // C[k]=B[j]; 113 // j++; 114 // } 115 // if(j>=n&&i<m){ 116 // C[k]=A[i]; 117 // i++; 118 // } 119 // if(i<m&&j<n){ 120 // if(A[i]<B[j]){ 121 // C[k]=A[i]; 122 // i++; 123 // } 124 // else{ 125 // C[k]=B[j]; 126 // j++; 127 // } 128 // } 129 // } 130 131 /*合并两个无序的数组*/ 132 for(k=0;k<m+n;k++){ 133 if(i<m){ 134 C[k]=A[i]; 135 i++; 136 } 137 else{ 138 C[k]=B[j]; 139 j++; 140 } 141 } 142 //sort1(C,0,m+n-1); 143 //sort2(C,0,m+n-1); 144 sort3(C,0,m+n-1); 145 146 //打印合并后的有序数组 147 for(k=0;k<m+n;k++) 148 printf("%d ",C[k]); 149 printf("\n"); 150 return 0; 151 }
以上是关于编程练习:合并两个数组(包括三种快排程序)的主要内容,如果未能解决你的问题,请参考以下文章
8种面试经典排序详解--选择,插入,希尔,冒泡,堆排,3种快排及非递归,归并及非递归,计数(图+C语言代码+时间复杂度)
8种面试经典排序详解--选择,插入,希尔,冒泡,堆排,3种快排及非递归,归并及非递归,计数(图+C语言代码+时间复杂度)
代码与算法集锦-归并排序+树状数组+快排+深度优先搜索+01背包(动态规划)