编程练习:合并两个数组(包括三种快排程序)

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背包(动态规划)

练习027:合并两个有序数组

#yyds干货盘点# LeetCode 腾讯精选练习 50 题:合并两个有序数组

练习014:合并两个有序链表