归并排序(Merge Sort)图解,归并排序算法_学到牛牛

归并排序是建立在归并操作上的一种有效、稳定的排序算法,该算法采用非常经典的分治法(分治法可以通俗的解释为:把一片领土分解,分解为若干块小部分,然后一块块地占领征服,被分解的可以是不同的政治派别或是其他什么,然后让他们彼此异化),归并排序的思路很简单,速度呢,也仅此于快速排序,接下来我们详细的看看归并排序的过程。

基本思路:

第一步:将序列中待排序数字分为若干组,每个数字分为一组。

第二步:将若干组两两合并,保证合并的组都是有序的。

第三步:重复第二步的操作,直到剩下最后一组即为有序数列。

详细步骤:

首先将数组中待排序数字分成若干组,每个数字为一组

相邻的两组进行对比,并且两两合并,保证合并后都是有序的数列,i(数字8)>  j(数字4)需要交换位置(最终呈现一个升序的数组),经过比较合并后两个数存入一个空的指针里

其他组按照此方法依次合并,从8个组合并成4个组

继续相邻的两个组进行合并

定义两个变量i,j分别代表P1里的第一个值(4)和P2里的第一个值(5),i和j进行比较,i < j(4 < 5),将数字4移入p中,i向后移动一位

i和j进行比较,i > j(8 > 5 ),将数字5移动到p中(4的后一位),j后移一位

i 和j继续进行比较,i > j (8 > 7),将数字7移动到p中(5的后一位),p2中没有待排序的数字,所以比较结束,p1中剩下的数字移动到p中(7的后一位),合并结束。旁边两个序列按照同样的方式进行合并,最后得到两个有序序列,将这两个有序序列通过上面的方式继续进行合并

i和j进行比较,i > j(4 > 1),i不动,p2中的数字1移动到p中,j向后移动一位

i继续和j比较,i > j(4 > 2),数字2移动到p中(1的后一位),j向后移动一位

i继续和j比较,i > j(4 > 3),数字3移动到p中(2的后一位),j向后移动一位

i继续和j比较,i < j(4 <6),数字4移动到p中(3的后一位),i向后移动一位

i继续和j比较,i < j(5 < 6),数字5移动到p中(4的后一位),i向后移动一位

i继续和j比较,i > j(7 >6),数字6移动到p中(5的后一位),p2中已经没有待排序的数字,所以比较结束,p1中剩下的数字移动到p中(6的后面)

最后得到一个有序的数列 ,归并排序结束

源代码 如下:

#include <stdio.h>

#include <stdlib.h>

void G_qsort(int *a,int first,int mid,int last,int *temp)

{

int n = mid,m = last;

int k = 0;

int i = first,j = mid+1;

while(i <= n && j <= m)  // 两边同时进行

{

if(a[i] <= a[j])  //  i和j进行比较

{

temp[k++] = a[i++];  // 如果i <= j,则i的值移动到temp里面

}

else

{

temp[k++] = a[j++];  // 如果i > j,则j的值移动到temp里面

}

}

while(i <= n)

{

temp[k++] = a[i++];

}

while(j <= m)

{

temp[k++] = a[j++];

}

for(i = 0; i < k; i++)

{

a[first+i] = temp[i];

}

}

void G_sort(int *a,int first,int last,int *temp)

{

if(first < last)  //  当同时到达一个数时结束判断

{

int mid = (first+last)/2;  // 找到中间值

G_sort(a,first,mid,temp);  //  递归函数左边

G_sort(a,mid+1,last,temp);  // 右边

G_qsort(a,first,mid,last,temp);  // 进行排序

}

}

int sort(int *a,int n)

{

int *p = malloc(n);  // 分配内存大小

if(p == NULL)

{

return -1;

}

else

{

free(p); 

G_sort(a,0,n-1,p);  // 调用函数传参,0和n-1为第一个数和最后一个数下标

p = NULL;

return 1;

}

}

int main()

{

int a[8]={8,4,5,7,1,3,6,2};

int i;

sort(a,8); // 调用函数传参

for(i = 0; i < 8; i++)

{

printf("%d",a[i]);

}

printf("\n");

return 0;

}

文章来源:学到牛牛 IT培训

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容