排序算法之归并排序
来源:互联网 发布:hadoop2.7.1 windows 编辑:程序博客网 时间:2024/05/14 20:02
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,归并排序将两个已排序的表合并成一个表。
归并排序基本原理:
通过对若干个有序结点序列的归并来实现排序。
所谓归并是指将若干个已排好序的部分合并成一个有序的部分。
归并排序基本思想:
设两个有序的子序列(相当于输入序列)放在同一序列中相邻的位置上:array[low..m],array[m + 1..high],先将它们合并到一个局部的暂存序列 temp (相当于输出序列)中,待合并完成后将 temp 复制回 array[low..high]中,从而完成排序。
在具体的合并过程中,设置 i,j 和 p 三个指针,其初值分别指向这三个记录区的起始位置。合并时依次比较 array[i] 和 array[j] 的关键字,取关键字较小(或较大)的记录复制到 temp[p] 中,然后将被复制记录的指针 i 或 j 加 1,以及指向复制位置的指针 p加 1。重复这一过程直至两个输入的子序列有一个已全部复制完毕(不妨称其为空),此时将另一非空的子序列中剩余记录依次复制到 array 中即可。
若将两个有序表合并成一个有序表,称为2-路归并。
#include <stdio.h>#include <string.h>#include <stdlib.h>void merge(int* array, int* temp, int first, int mid, int last){ int first_elm = first; int second_elm = mid + 1; int i = 0; for(i = 0; first_elm <= mid && second_elm <= last; ++i) { if (array[first_elm] < array[second_elm]) { temp[i] = array[first_elm]; ++first_elm; } else { temp[i] = array[second_elm]; ++second_elm; } } for(; first_elm <= mid; ++first_elm, ++i) { temp[i] = array[first_elm]; } for(; second_elm <= last; ++second_elm, ++i) { temp[i] = array[second_elm]; } memcpy(array + first, temp, sizeof(int)*(last - first + 1));}void mergesort(int* array, int* temp, int first, int last){ if(first == last)temp[first] = array[first];else { int mid = first + (last - first)>>1;//使用减法防止移除,移位运算效率比除法效率高 mergesort(array, temp, first, mid); mergesort(array, temp, mid + 1, last); merge(array, temp, first, mid, last); }}int main(){ int i;int array[] = {942, 12, 24, 87, 9, 475, 65, 17, 91, 1}; int size = sizeof(array); int* temp = (int*)malloc(sizeof(array)); mergesort(array, temp, 0, 9); for(i = 0; i < 10; i++) { printf("%d ", array[i]); } printf("\n"); free(temp); return 0;}
归并排序时间复杂度为最坏情况下和平均情况下复杂度均为:O(nlogn),所需存储空间为:O(n)
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 竞赛积分猜想
- 第二周hdu1282
- 简单查看和修改数据库的只读/读写属性
- XP安装VMware-viclient提示:microsoft virtual j# 2.0 second edition 安装程序返回错误代码“4121”
- Cocos2d-x学习之实现类似android的菜单栏tabbar效果
- 排序算法之归并排序
- php与oracle连接函数详解oci_connect
- 解决Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.-
- priority_queue用法
- socket 编程入门教程(一)TCP server 端:5、创建监听嵌套字
- linux定时任务的设置
- c/c++程序之_KMP字符串模式匹配详解
- UrlRewriteFilter 学习笔记
- VC回调函数