归并排序
来源:互联网 发布:怎样发淘宝买家秀 编辑:程序博客网 时间:2024/06/11 03:30
归并排序是将两个有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。如图所示
比较2个数列的第一个数,谁小就先取谁,然后接着进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。
#include <stdio.h>void MergeArray(int arr[], int first, int mid, int last, int temp[])//将两个有序数组合并{ int i = first, j = mid+1; int n = mid, m = last; int k = 0; while(i <= n && j <= m) { if(arr[i] <= arr[j]) temp[k++] = arr[i++]; else temp[k++] = arr[j++]; } while(i <= n) temp[k++] = arr[i++]; while(j <= m) temp[k++] = arr[j++]; for(i = 0; i < k; i++) { arr[first+i] = temp[i]; }}void MergeInsert(int arr[], int first, int last, int temp[])//递归分解数组{ if(first < last) { int mid = (first+last)/2; MergeInsert(arr, first, mid, temp);//左边有序 MergeInsert(arr, mid+1, last, temp);//右边有序 MergeArray(arr, first, mid, last, temp);//合并 }}void MergeSort(int arr[], int length){ int b[10]; MergeInsert(arr, 0, length-1, b);}void main(){ int arr[] = {3,2,1,5,6,7,8,9,0,4}; int i = 0; for(i = 0; i < 10; i++) { printf("%d ", arr[i]); } printf("\n"); MergeSort(arr, 10); for(i = 0; i < 10; i++) { printf("%d ", arr[i]); } printf("\n");}
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- hdu 5058 So easy
- 括号配对问题
- 冒泡排序-用指针方式实现
- 对容器元素重新排序的算法
- [iuud8]基于cocos2dx2.26在mac下编译通过的.so文件移植到win32位环境
- 归并排序
- git使用简介
- IntelliJ Idea 常用快捷键列表
- A Mathematical Curiosity(坑水题)
- 浅析人脸检测之Haar分类器方法
- tomcat redis session 共享
- sgu152: Making round
- 字符串逆置
- 笔记:Log4J自助餐