排序算法大集锦_合并排序_1(分治思想)

这一系列博客的特点就是——给出每趟排序的结果

本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好,所以这些博客就算是对自己的总结吧。

#include <stdio.h>
#include <limits.h>
#include <malloc.h>

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

void merge(int *m, int x, int y, int z)
{
	int b1,b2,i,j,k;
	b1=y-x+1;
	b2=z-y;

	int *tm1=(int*)malloc(sizeof(int)*(b1+1));
	int *tm2=(int*)malloc(sizeof(int)*(b2+1));

	for(i=0;i<b1;i++)
		tm1[i]=m[i+x];
	for(j=0;j<b2;j++)
		tm2[j]=m[j+y+1];

	tm1[i]=tm2[j]=INT_MAX;

	for(k=x,i=0,j=0;k<=z;k++)
	{
		if (tm1[i]<tm2[j])
		{
			m[k]=tm1[i];
			i++;
		} 
		else
		{
			m[k]=tm2[j];
			j++;
		}
	}

	free(tm1);
	free(tm2);
}

void MergeSort(int *m,int n1, int n2)
{
	if(n1<n2)
	{
		int n=(n1+n2)/2;
		MergeSort(m,n1,n);
		MergeSort(m,n+1,n2);
		merge(m,n1,n,n2);
		for(int t=0;t<10;t++)
			printf("%d ",m[t]);
		printf("\n");
	}
}

int main()
{
	int i;
	for(i=0;i<10;i++)
		printf("%d ",a[i]);

	printf("\n排序后\n");

	MergeSort(a,0,9);

	printf("\n最终结果\n");
	for(i=0;i<10;i++)
		printf("%d ",a[i]);

	printf("\n");

	return 0;
}

运行结果

时间: 2024-10-09 06:10:11

排序算法大集锦_合并排序_1(分治思想)的相关文章

排序算法大集锦_各种排序算法性能比较

对10000个1-10000的随机数进行排序,并显示出运行时间 数组是用以前用VC++&MatLab生成的,比较长...哈哈,感受一下计算机的速度! #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <malloc.h> #include <time.h> int a[10000]={ 5282,330

排序算法大集锦_二路归并排序_2&3(分治思想)

第一段代码和合并排序差不多,用它来和第二段代码--二路归并排序作对比. 这一系列博客的特点就是--给出每趟排序的结果 本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好,所以这些博客就算是对自己的总结吧. #include <stdio.h> #include <limits.h> #include <malloc.h> void merge(int *m, int x, int y, int z) { int b1,b2,i,j,k; b1=y

排序算法大集锦_线性时间_计数排序

这个之前在<编程珠玑>上面看到过,当时就感觉特别神奇! 速度突破了其他排序算法的下限 后来在<算法导论>上面又看到了,感触颇深!所以一定好好啃透<算法导论> 这一系列博客的特点就是--给出每趟排序的结果 本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好,所以这些博客就算是对自己的总结吧. #include <stdio.h> #include <string.h> int a[10]={2,8,6,7,3,3,1,9,6

排序算法大集锦_插入类——直接插入排序

这一系列博客的特点就是--给出每趟排序的结果 本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好.<算法导论>上面那个比喻,比做打扑克牌的插入新牌,就比较形象.所以这些博客就算是对自己的总结吧. #include <stdio.h> void InsertSort(int *m, int n) { int i,j,temp; for(i=1;i<n;i++) { temp=m[i]; j=i-1; while(j>=0 && te

排序算法大集锦_交换类——快速排序

感觉<算法导论>上面的那个例子要更容易理解,因为那个最起码比较直观! #include <stdio.h> int a[10]={2,8,5,7,4,3,1,9,6,10}; void QuickSort(int m, int n) { int s,begin,end; if(m>n) return; begin=m; end=n; s=a[m]; while(begin!=end) { while(a[end]>=s && begin<end)

排序算法大集锦_选择类——直接选择排序

这一系列博客的特点就是--给出每趟排序的结果 本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好,所以这些博客就算是对自己的总结吧. #include <stdio.h> void SelectSort(int *m, int n) { int i,j,k,temp; bool flag; for(i=0;i<n-1;i++) { k=i; flag=true; for(j=i+1;j<n;j++) if(m[j]<m[k]) k=j; if(k!=i

排序算法大集锦_插入类——希尔(shell)排序

这一系列博客的特点就是--给出每趟排序的结果 本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好,所以这些博客就算是对自己的总结吧. #include <stdio.h> void ShellSort(int *m, int n) { int i,flag,gap; for(gap=n;gap!=1;) { gap/=2; do { flag=0; for(i=0;i<n-gap;i++) if(m[i]>m[i+gap]) { m[i]=m[i]^m[i+

排序算法大集锦_交换类——冒泡排序

冒泡排序是在高中时代就接触到的一种排序,较为简单,相对其它排序要容易理解 这一系列博客的特点就是--给出每趟排序的结果 本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好,所以这些博客就算是对自己的总结吧. #include <stdio.h> void BubbleSort(int *m, int n) { int i,j; for(i=0;i<n-1;i++) { for(j=1;j<n-i;j++) if(m[j]<m[j-1]) { m[j]=

排序算法大汇总

排序算法大汇总 排序算法是最基本最常用的算法,也是各大上市公司经常会被问道的面试知识点之一,不同的排序算法在不同的场景或应用中会有不同的表现,我们需要对各种排序算法熟练才能将它应用到实际应用中,才能更好的发挥他们的优势,那么今天我们来对各种算法进行一个简单的总结和分析. 冒泡排序 冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个元素比较,交换也发生在这两个元素之间.所以,如果两个元素相等,我们不会无聊地把他们俩交换:如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相