归并排序:
归并操作,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
(1) 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
(2) 设定两个指针,最初位置分别为两个已经排序序列的起始位置
(3) 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
(4) 重复步骤3直到某一指针到达序列尾
(5) 将另一序列剩下的所有元素直接复制(抄)到合并序列尾
简单的说,就是将一个序列不断的进行二分(当然也可以三分、多分)分裂,然后递归下去,再合并。
源代码:
- /*=============================================================================
- #
- # FileName: Merge_Sort.c
- # Desc: 归并排序
- #
- # Author: zhangyuqing
- #
- # Created: 2014年6月29日23:18:16
- # Version: 0.0.1
- #
- =============================================================================*/
- #include "stdafx.h"
- #include <stdlib.h>
- #include <malloc.h>
- //归并操作
- void merge(int src[], int des[], int low, int high ,int mid)
- {
- int i = low;
- int k = low;
- int j = mid + 1;
- while (( i <= mid ) && ( j <= high ))
- {
- if (src[i] < src[j])
- {
- des[k++] = src[i++];
- }
- else
- {
- des[k++] = src[j++];
- }
- }
- while (i <= mid)
- {
- des[k++] = src[i++];
- }
- while (j <= high)
- {
- des[k++] = src[j++];
- }
- }
- void MSort(int src[], int des[] ,int low, int high, int max_size)
- {
- int mid = (low + high) / 2;
- if (low == high)
- {
- des[low] = src[low];
- }
- else
- {
- int mid = (low + high) / 2;
- int * des_space = (int *)malloc(sizeof(int) * max_size);
- if (NULL != des_space)
- {
- MSort( src, des_space, low, mid, max_size);
- MSort( src, des_space, mid+1, high, max_size);
- merge( des_space, des, low, high, mid);
- }
- free(des_space);
- }
- }
- void Meger_Sort(int arr[], int low, int high, int len)
- {
- MSort( arr, arr, low, high, len);
- }
- int main(void)
- {
- int arr[10];
- for ( int i=0; i<10; i++) //初始化数据
- {
- arr[i] = rand()%100; //随机生成数据
- }
- printf("Before sort:\n"); //打印排序前的数据
- for (int i = 0; i < 10; i++)
- {
- printf("%d ",arr[i]);
- }
- //开始排序
- Meger_Sort( arr, 0, 10-1, 10);
- printf("\nAfter sort:\n"); //打印排序后的数据
- for (int i = 0; i < 10; i++)
- {
- printf("%d ",arr[i]);
- }
- system("pause");
- return 0;
- }
运行结果:
- Before sort:
- 41 67 34 0 69 24 78 58 62 64
- After sort:
- 0 24 34 41 58 62 64 67 69 78 请按任意键继续. . .