归并排序法

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

若出现卡死现象,一般为指针,或者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:\n");
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:\n");
19     for(i=1;i<6;i++)
20     {
21         printf("%4d",s[i]);
22     }
23     printf("\n");
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:\n");
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:\n");
19     for(i=1;i<6;i++)
20     {
21         printf("%4d",s[i]);
22     }
23     printf("\n");
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与什么比较的区别这也有很大的区别的。心心细心!!!!!!!

时间: 2024-11-04 17:10:11

归并排序法的相关文章

求逆序数模板(树状数组+离散化 || 归并排序法)

一篇不错的讲解:http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 代码如下:(树状数组+离散化) #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn=500017; int n; int aa[maxn

排序算法之--归并排序法

归并排序法 参考文章: https://www.cnblogs.com/chengxiao/p/6194356.html https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F 基本思想: 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略. 分治法将问题分(divide)成一些小的问题后求解,而治(conquer)的阶段则将分的阶段得到的各

归并排序法---题目

题目内容: 在一個N個數字的序列S裡,當S[i] > S[j] 且 i < j的時候,我們說(i ,j)是一個逆序數對. Hint : 利用歸併排序法計算一個序列裡有多少逆序數對. Hint : 思考一下在merge的過程,怎麼找到答案! Hint : 直接使用兩層迴圈來找答案的話會超過系統時間限制. 输入格式: 只有一筆測資,第一行為一個數字N,代表接下來有N行,每行有一個數字.這N個數字都會相異. 數字範圍: 0 < N < 20000 输出格式: 輸出一行數字,該序列的逆序數

利用归并排序法计算一个序列里有多少逆序对数(详细讲解)

前言 今天遇到求逆序对的问题,经过一番思索之后,特意来总结一下.因为也学习到了很多方法,以前自己一些百思不得其解的问题也有了解答. 正文 先上一个简单的问题: 分析:题目中说使用插入排序,也就是在排序过程中计算交换的次数,按照插入排序的原理,先定第一个,再定前两个的顺序,以此类推,只要交换了,我的次数就加一,但实际上,我们一直按照原始序列的顺序一直在往后走,所以(好,重点来了)我们要插入的就是前面比我大的数字前面的位置,也就是说,我需要交换的次数就是前面比我大的数字的个数,那么我考虑那就没必要进

归并排序法和基数排序法

归并排序法,这里介绍二路归并排序法,其他原理类似,只是更加复杂. 归并排序(Merge Sort)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列. 归并排序的具体做法: 把原序列不断地递归等分,直至每等份只有一个元素,此时每等份都是有序的. 相邻等份合并,不断合并,直至合并完全. 二路归并 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.归并

算法导论第2章 分治法与归并排序, 二分查找法

分治策略:将原问题划分成n个规模较小而结构与原问题相似的子问题,然后递归地解决这些子问题,最后再合并其结果,就可以得到原问题的解. 它需要三个步骤: 分解:将原问题分解成一系列的子问题. 解决:递归地解决各个子问题.若子问题足够小,则直接求解. 合并:将子问题的结果合并成原问题的解. 通过分治策略和分治步骤,可以简单地默出归并算法. 分解:将n个元素分成各自包含n/2个元素的子序列 解决:用归并排序法递归地对两个子序列进行排序. 合并:合并两个以排序的子序列,得到排序结果: void merge

两路归并排序

链表两路归并 #include<iostream> #include<assert.h> using namespace std; struct node { int val; node * next; node(int v) { val=v; next=NULL; } }; node * merge(node* list1 , node * list2) { assert(list1!=NULL&&list2!=NULL);//括号中是希望出现的正确的情况  no

让算法会说话之归并排序

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/27570953 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.归并排序算法依赖归并操作. 一.归并排序算法 /*************************************************************** *版权所有 (C)2014,公司名称. * *文件名称:归并排序法 *内容摘要:无 *其它说明:无 *

POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)

Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10575   Accepted: 5489 Description BackgroundRaymond Babbitt drives his brother Charlie mad. Recently Raymond counted 246 toothpicks spilled all over the floor in an instant just b