排序总结----归并排序

来源:互联网 发布:哪里披头士的歌 知乎 编辑:程序博客网 时间:2024/06/05 13:32
//// Created by liyuanshuo on 2017/3/17.//#include "merge_sort.h"/* * * 归并排序: * * 基本思想: * 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列 * 每个子序列是有序的。然后再把有序子序列合并为整体有序序列。 * * 归并方法: * * 设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度分别为n-i +1、n-m。 * 1.j=m+1; k=i; i=i;//置两个子表的起始下标,以及辅助数组的起始下标 * 2.如果 i > m 或者 j > n, 转4. //其中一个子记录已经合并完毕,比较选取结束 * 3.选出min(r[i],r[j])中较小的存入辅助数组rf *  如果r[i] < r[j], rf[k] = r[i], i++, k++;转2. *  否则rf[k] = r[j]; j++; k++; 转2. * 4.将尚未处理完的子记录存入到数组rf; *  如果i<=m, 将r[i...m]存入到rf[k.....n] //前一个子记录非空 *  如果j<=n, 将r[j...n]存入到rf[k.....n] //后一个子记录非空 * 5.合并结束 */void merge( int r[], int rf[], int i, int m, int n){int j, k;for( j = m + 1, k<i ; i<=m && j<= n ; ++k ){if( r[j] < r[j] )rf[k] = r[j++];elserf[k] = r[i++];}while ( i <= m )rf[k++] = r[j++];while ( j <= n )rf[k++] = r[j++];}void merge_sort( int r[], int rf[], int len ){int l = 1;int *q = r;int *tmp;while ( l < len ){int s = l;l = 2 * s;int i =0;while ( i+l < len ){merge (q, rf, i, i+s-1, i+l-1);i += l;}if( i + s < len ){merge (q, rf, i, i+s-1, len-1);}tmp = q;q = rf;rf = tmp;}}/* * 两路归并的递归算法: */void m_sort( int r[], int rf[], int s, int t){int *rf2;if( s == t ){r[s] = rf[s];}else{int m = (s+t) / 2;m_sort (r, rf2, s, m);m_sort (r, rf2, m+1, t);merge (rf2, rf, s, m+1, t);}}void merge_sort_recursive( int r[], int rf[], int n ){m_sort (r, rf, 0, n-1);}

0 0
原创粉丝点击