首页 > 其他分享 >归并排序

归并排序

时间:2022-10-14 22:15:47浏览次数:48  
标签:归并 int void pos mid printf 排序 scanf

归并排序

1.思路

通过不断的划分区域,使其每个区域独自有序,为后续的合并埋下伏笔。由于两个区域是有序的,合并的时候就会降低排序的时间复杂度。

2.代码

2.1递归思想

#include<stdio.h>
#include<stdlib.h>

int n;
int* a;

void init() {
	printf("请输入n:");
	scanf("%d", &n);
	a = (int*)malloc(sizeof(int) * n);
	for (int i = 0; i < n; i++)
		scanf("%d", a + i);
}

void print() {
	for (int i = 0; i < n; i++)
		printf("%d ", a[i]);
}

void merge(int* temp, int left, int mid, int right) {
	int l_pos = left;
	int r_pos = mid + 1;
	int pos = l_pos;
	while (l_pos <= mid && r_pos <= right) {
		if (a[l_pos] < a[r_pos])
			temp[pos++] = a[l_pos++];
		else
			temp[pos++] = a[r_pos++];
	}
	while (l_pos <= mid)
		temp[pos++] = a[l_pos++];
	while(r_pos <= right)
		temp[pos++] = a[r_pos++];
	while (left <= right) {
		a[left] = temp[left];
		left++;
	}
}

void Sort(int* temp, int left, int right) {
	if (left < right) {
		int mid = (left + right) / 2;
		Sort(temp,left,mid);
		Sort(temp, mid + 1, right);
		merge(temp,left,mid,right);
	}
}

void mergeSort() {
	int* temp = (int*)malloc(sizeof(int) * n);
	if (temp) {
		Sort(temp, 0, n - 1);
		free(temp);
	}
	else
		printf("error:failed to allocate the memory");
}

int main() {
	init();
	mergeSort();
	print();
	free(a);
	return 0;
}

2.2迭代思想

#include<stdio.h>
#include<stdlib.h>

int n;
int* a;

void init() {
	printf("请输入n:");
	scanf("%d", &n);
	a = (int*)malloc(sizeof(int) * n);
	for (int i = 0; i < n; i++)
		scanf("%d", a + i);
}

void print() {
	for (int i = 0; i < n; i++)
		printf("%d ", a[i]);
}

void merge(int* temp, int left, int mid, int right) {
	int l_pos = left;
	int r_pos = mid + 1;
	int pos = l_pos;
	while (l_pos <= mid && r_pos <= right) {
		if (a[l_pos] < a[r_pos])
			temp[pos++] = a[l_pos++];
		else
			temp[pos++] = a[r_pos++];
	}
	while (l_pos <= mid)
		temp[pos++] = a[l_pos++];
	while(r_pos <= right)
		temp[pos++] = a[r_pos++];
	while (left <= right) {
		a[left] = temp[left];
		left++;
	}
}

void Sort(int* temp, int left, int right) {
	if (left < right) {
		int mid = (left + right) / 2;
		Sort(temp,left,mid);
		Sort(temp, mid + 1, right);
		merge(temp,left,mid,right);
	}
}

void mergeSort() {
	int* temp = (int*)malloc(sizeof(int) * n);
	if (temp) {
		Sort(temp, 0, n - 1);
		free(temp);
	}
	else
		printf("error:failed to allocate the memory");
}

int main() {
	init();
	mergeSort();
	print();
	free(a);
	return 0;
}

标签:归并,int,void,pos,mid,printf,排序,scanf
From: https://www.cnblogs.com/cony1/p/16793166.html

相关文章

  • Elasticsearch使用terms聚合之后进行分页排序
    引言elasticsearch中实现聚合也非常常见,同时es的数据量一般比较大,因此聚合结果比较多,像terms聚合默认只返回10条聚合结果,所以聚合之后进行分页,也是非常常见的操作。es的t......
  • 力扣-排序算法
    部分题解保存排序数组-快速排序classSolution{privatefinalstaticRandomrandom=newRandom(System.currentTimeMillis());publicint[]sortArray(in......
  • 3、插入排序-Go语言版
    前情提示Go语言学习者,文章若有不妥之处,感谢指正。本文参考:https://www.runoob.com/w3cnote/ten-sorting-algorithm.html为了便于下载和整理,已开源放在:https://github......
  • 蓝桥杯省赛 研究生组 双向排序
    过60%数据#include<iostream>usingnamespacestd;voidquick_sort_down(intq[],intl,intr){if(l>=r){return;}inti=l-1,j=r......
  • 83. 删除排序链表中的重复元素
    题目描述给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。示例代码varremoveDuplicates=function(nums){if(n......
  • 插入排序
    插入排序的原理:将指针指向某元素(一般从第二个元素开始),假设该元素的左侧全部有序,将该元素抽取,然后按照从右往左的顺序分别与其左边的元素进行比较,遇到较大的元素便将较大的......
  • 选择排序,选择排序是对冒泡排序的改进,对数据量较大的排序效率会有很大提升
    选择排序的原理:从第一个元素开始,分别于后面的元素相比较,遇到最小值就交换位置,第一轮结束;从第二个元素开始,分别与后面的元素相比较,找到倒数第二小的元素,并交换位置,重复上述......
  • elasticsearch聚合查询之排序
    排序默认只能按两个字段排序:_count和_key 如果想按二次聚合结果中的字段排序语法如下: GEThow2java/product/_search//求每个地方商品数量,并按平均价格从高往低排......
  • Java数组06(冒泡排序)
    冒泡的代码两层循环,外层冒泡轮数,里层依次比较比较数组中,两个相邻的元素,如果的一个数比第二个数大,我们就交换他们的位置每一次比较,都会产生出一个最大,或者最小的数......
  • python使用xml.dom.minidom写xml节点属性会自动排序问题解决
    1.背景及问题一个xml文件,过滤掉部分节点,生成新的xml文件,但是生成后,发现节点的属性顺序变化了,根据key的字母信息排了序。如原始信息:<stringtypename="time_type"length......