算法 归并排序

核心思想:将多个有序数组进行合并变成一个有序的

1.获得中间位置mid

2.左 起始~mid

右 mid+1~结束

3.合并(合并两个有序数组,方法有点像合并两个有序链表)

void hebing(int *arr,int begin,int end) {
	//获取中间值
	int mid = (begin + end) / 2;
	//申请一个与数组长度相同的新数组
	int* newarr = (int *)malloc(sizeof(int) * (end - begin + 1));
	//左半部分起始是begin,结束是mid
	int left = begin;
	//左半部分起始是mid+1,结束是end
	int right = mid + 1;
	//标记下一次插入到新数组的位置
	int index = 0;
	//循环比较左半部分和右半部分谁小谁插入到新数组,知道一边已经走完
	while (right <= end && left <= mid) {
		if (arr[right] < arr[left]) newarr[index++] = arr[right++];
		else newarr[index++] = arr[left++];
	}
	//把没有走完的一边的剩余的元素放入到数组中
	while (left <= mid)
	{
		newarr[index++] = arr[left++];
	}
	while (right <= end)
	{
		newarr[index++] = arr[right++];
	}
	//这里index--是因为每次插入后都会index++
	//最后一次插入后index就不需要++了要把多加的减回来
	index--;
	//再把插入到新数组的值插入回原数组
	while (index >= 0) {
		arr[begin+index] = newarr[index];
		index--;
	}
	//释放申请的新数组
	free(newarr);
    newarr = NULL;
}
//归并排序
void guibingSort(int* arr, int begin, int end) {
	//获得中间值
	int mid = (begin + end) / 2;
	//起始和结束相同时说明就剩一个元素,有序了,返回
	if (begin == end) {
		return;
	}
	guibingSort(arr, begin, mid);//处理左半部分
	guibingSort(arr, mid+1, end);//处理右半部分
	hebing(arr, begin, end);//两边处理完都有序了就合并
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
归并排序是一种基于归并操作的有效排序算法,它采用分治法的思想。算法的基本思想是将已有序的子序列合并,得到完全有序的序列。在归并排序中,先将待排序序列通过二分法分为若干个有序子序列,然后再将这些子序列两两合并,直到最终得到完全有序的序列。归并排序通过牺牲空间来换取更高的时间效率。 以下是C语言实现归并排序的具体代码: ```c #include <stdio.h> // 合并两个有序数组 void merge(int arr[], int left, int mid, int right) { int i, j, k; int n1 = mid - left + 1; int n2 = right - mid; // 创建临时数组 int L[n1], R[n2]; // 将数据复制到临时数组中 for (i = 0; i < n1; i++) L[i] = arr[left + i]; for (j = 0; j < n2; j++) R[j] = arr[mid + 1 + j]; // 归并临时数组到原数组中 i = 0; j = 0; k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } // 复制剩余的元素 while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } // 归并排序 void mergeSort(int arr[], int left, int right) { if (left < right) { int mid = left + (right - left) / 2; // 分 mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); // 治 merge(arr, left, mid, right); } } int main() { int arr[] = {12, 11, 13, 5, 6, 7}; int n = sizeof(arr) / sizeof(arr[0]); printf("排序前的数组: \n"); for (int i = 0; i < n; i++) printf("%d ", arr[i]); mergeSort(arr, 0, n - 1); printf("\n排序后的数组: \n"); for (int i = 0; i < n; i++) printf("%d ", arr[i]); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值