归并排序模拟讲解

来源:互联网 发布: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;}