归并排序模拟讲解
来源:互联网 发布:aes算法密钥最小长度 编辑:程序博客网 时间:2024/06/10 16:31
归并算法速度比较快,但也难理解,我用很详细的叙述将 整个过程给模拟了出来
实现如下:
/*Filename:mergeSort.cppAuthor: xiaobingE-mail: xiaobingzhang29@gmail.comDate: 2013-08-27*/#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#define N 10using namespace std;/* *归并排序:归并排序的思想是合并两个已经有序的序列为一个大的有序的序列首先,进行分组,一分为二,二分为四,依次下去,最终的状态是全部分组为一个元素,然后向上开始和并分组,四个合并为两个,二个合并为一个,最终在合并的过程中将顺序排好了,具体如下:当合并的时候,有两个指针,i,j分别指向分组的第一个元素,分陪一个与数组同样大小的数组temp,定义一个k用于遍历数组temp,k指向两个分组中的最低的位置,即合并分组传入的开始位置,然后分别用指针i和j开始比较第一个分组和第二个分组元素的大小,选择小的元素存入temp,同时k增1,在小的元素的那个分组的指针增1,直到其中一个分组的元素全部完毕为止,然后把另一个剩下的元素存入temp中,k和剩下元素自增。这样,temp中就把两个分组的元素排好顺序了,接着,将这些数据对应原数组的为止写入,达到局部有序了,经过从小的分组 不断合并,最终整个数组就是排序排好的了。 */int temp[N]; //定义了一个和原数组同样大小的临时数组,用于保存两个分组合并的结果void merge(int arr[], int start, int mid, int end);/* *@param arr 待排序的数组 @param start 待排序的数组的开始位置,可以只排序想要排序的一部分 @param end 待排序的数组的结束位置,比长度值少1 该函数的功能是用于对数组进行分组,然后调用合并函数将两个分组进行合并 使得每两个分组都是合并后都是有序的 */void mergeSort(int arr[], int start, int end){if(start < end){int mid = (start + end) / 2; //分界点mergeSort(arr, start, mid); //将分组分到最小,所以递归调用分组mergeSort(arr, mid + 1, end);merge(arr, start, mid, end); //合并start~mid 和 mid + 1 ~ end两个分组}}/* *@param arr 待排序的数组 @param start 分组1的开始位置 @param mid 两个分组的分界点 @param end 两个分组的结束位置 该函数的功能用于合并两个分组为一个有序的分组 */void merge(int arr[], int start, int mid, int end){ //定义了第一个分组的指针i,指向第一个分组的第一个位置//定义了第二个分组的指针j,指向第二个分组的第一个位置//定义了一个临时数组位置,使其指向两个分组的起始位置//这个位置用于将这个两个分组的元素复制到临时数组中int i = start, j = mid + 1, k = start;//当两个分组都没有遍历完时,即,如果有一个遍历完了,循环结束while(i <= mid && j <= end){//比较如果小的那个元素,将被复制到临时数组中,并移动其指针,指向//下一个元素,进行下一次比较if(arr[i] > arr[j]){temp[k++] = arr[j++];} else {temp[k++] = arr[i++];}}//经过比较完后,如果还有元素剩余,由于两个分组都是有序分组,所以剩余的元素 //是有序的并且比较大的元素,所以直接复制到后面即可while(i <= mid){temp[k++] = arr[i++];}//同上while(j <= end){temp[k++] = arr[j++];}//将临时数组中的值对号赋值回原数组中,这样达到了对原数组的排序for(i = start; i <= end; i++){arr[i] = temp[i];}}void print(int arr[], int n){int i;for(i = 0;i < n;i++){cout<<arr[i]<<" ";}cout<<endl;}int main(){int arr[N] = {2342,35,45,45,3,24,123,345,234,345};mergeSort(arr, 0, N - 1);print(arr, N); return 0;}
- 归并排序模拟讲解
- 归并排序:步骤讲解与代码实现
- 归并排序:步骤讲解与代码实现
- 快速排序算法实现,模拟讲解
- 数据结构实验之排序五:归并求逆序数(讲解归并排序算法)
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- hdu4081 Qin Shi Huang's National Road System
- codeforces 197 2
- oracle 游标处理过程
- Android 两Activity之间动画效果(3)---------缩放,仿QQ头像点击放大
- Android保存Log信息到本地文件
- 归并排序模拟讲解
- 今日所想
- CGAffineTransformMake 矩阵变换 的运算原理
- 备份文件之批处理程序
- 计算机网络的五层协议栈(摘录自计算机网络 自顶向下第四版)
- POJ2075 & TOJ2119 Tangled in Cables
- android知识点一:自定义xml对话框
- hdu 1026 Ignatius and the Princess I
- Linux进程休眠和唤醒