zoukankan      html  css  js  c++  java
  • 归并排序法

    归并排序法

    • 归并排序法是将两个(或两个以上)的有序表合并成一个新的有序表。即把待排列的序列分成若干个子序列,每个子序列都是有序的,然后再把子序列合并成整体有序序列。
    • 采用分治法
    • 运用递归来完成

       若出现卡死现象,一般为指针,或者scanf 或者whlie的使用错误!!!!!

    其正确c语言编程如下:

     1 #include<stdio.h>
     2 
     3 //归并排序法
     4 void merge(int a[],int b[],int start,int mid,int end);
     5 void merge_sort(int a[],int b[],int start,int end);
     6 int main()
     7 {
     8     int i;
     9     int s[6];
    10     printf("please enter five numbers:
    ");
    11     for(i=1;i<6;i++)
    12     {
    13         scanf("%d",&s[i]);
    14     }
    15 
    16     merge_sort(s,s,1,5);
    17 
    18     printf("after number:
    ");
    19     for(i=1;i<6;i++)
    20     {
    21         printf("%4d",s[i]);
    22     }
    23     printf("
    ");
    24 }
    25 void merge(int a[],int b[],int start,int mid,int end)
    26 {
    27     int i,j,r;
    28     i=start;
    29     j=mid+1;
    30     r=start;
    31     while(i<=mid && j<=end)
    32     {
    33         while(a[i]>a[j])
    34         {
    35             b[r]=a[j];
    36             r++;
    37             j++;
    38         }
    39         while(a[i]<a[j])
    40         {
    41             b[r]=a[i];
    42             i++;
    43             r++;
    44 
    45         }
    46 
    47         while(i<=start)
    48         {
    49                 b[r++]=a[i++];
    50         }
    51         while(j<=end)
    52         {
    53             b[r++]=a[j++];
    54         }
    55 
    56 
    57     }
    58 }
    59 void merge_sort(int a[],int b[],int start,int end)
    60 {
    61     int i,j,d;
    62     int t[20]={0};
    63     i=start;
    64     j=end;
    65     d=(i+j)/2;
    66 
    67     merge_sort(a,t,i,d);
    68     merge_sort(a,t,d,j);
    69     merge(t,b,i,d,j);
    70 
    71 }

    哈哈哈哈哈 ,是错的。但是为什么?

    你发现了吗?

    你是否明确while和if ,但是在使用的时候你是否知道其中的区别呢?

    正正正确的如下所示、

     1 #include<stdio.h>
     2 
     3 //归并排序法
     4 void merge(int a[],int b[],int start,int mid,int end);
     5 void merge_sort(int a[],int b[],int start,int end);
     6 int main()
     7 {
     8     int i;
     9     int s[6];
    10     printf("please enter five numbers:
    ");
    11     for(i=1;i<6;i++)
    12     {
    13         scanf("%d",&s[i]);
    14     }
    15 
    16     merge_sort(s,s,1,5);
    17 
    18     printf("after number:
    ");
    19     for(i=1;i<6;i++)
    20     {
    21         printf("%4d",s[i]);
    22     }
    23     printf("
    ");
    24 }
    25 void merge(int a[],int b[],int start,int mid,int end)
    26 {
    27     int i,k,r;
    28     r=start;
    29     i=start;
    30     k=mid+1;
    31     while(i<=mid && k<=end)
    32     {
    33         if(a[i]>a[k])
    34         {
    35             b[r]=a[k];
    36             r++;
    37             k++;
    38         }
    39         else
    40         {
    41             b[r]=a[i];
    42             r++;
    43             i++;
    44         }
    45     }
    46     while(i<=mid)
    47     {
    48         b[r++]=a[i++];
    49     }
    50     while(k<=end)
    51     {
    52         b[r++]=a[k++];
    53     }
    54 }
    55 void merge_sort(int a[],int b[],int start,int end)
    56 {
    57     int i,j,d;
    58     int t[20]={1};
    59     i=start;
    60     j=end;
    61     d=(i+j)/2;
    62     if(i==j)
    63         b[i]=a[i];
    64     else
    65     {
    66 
    67 
    68         merge_sort(a,t,i,d);
    69         merge_sort(a,t,d+1,j);
    70         merge(t,b,i,d,j);
    71     }
    72 
    73 }

    编写程序,一定要思路清晰。正如,i、j与什么比较的区别这也有很大的区别的。心心细心!!!!!!!

  • 相关阅读:
    爬虫笔记1
    python逐行读取文件&作成xml文件
    C#.NET自定义下拉框实现选中下拉list的值和显示框内的值不同
    Mongodb笔记
    tomcat启动脚本
    mysql相关函数
    关于SQL_Errno1677导致主从复制中断处理
    mysql慢查询日志切换
    mysql5.7 忘记root密码处理
    Python零基础入门(4)-------简单了解Python是怎么运行
  • 原文地址:https://www.cnblogs.com/xiaochige/p/6010565.html
Copyright © 2011-2022 走看看