归并排序,基数排序(5)

归并:

1.详细解释
https://www.cnblogs.com/jingmoxukong/p/4308823.html

2.C++代码

#include<bits/stdc++.h>
using namespace std;
/*元素合并*/ 
void Merge(int array[], int low, int mid, int high) 
{
    int i = low; // i是第一段序列的下标
    int j = mid + 1; // j是第二段序列的下标
    int k = 0; // k是临时存放合并序列的下标
    int array2[high - low + 1] ; // array2是临时合并序列
    // 扫描第一段和第二段序列,直到有一个扫描结束
    while (i <= mid && j <= high) 
    {
        // 判断第一段和第二段取出的数哪个更小,将其存入合并序列,并继续向下扫描
        if (array[i] <= array[j]) 
            array2[k++] = array[i++];      
        else 
            array2[k++] = array[j++];

    }
    // 若第一段序列还没扫描完,将其全部复制到合并序列
    while (i <= mid) 
    {
        array2[k++] = array[i++];
    }
    // 若第二段序列还没扫描完,将其全部复制到合并序列
    while (j <= high) 
    {
        array2[k++] = array[j++];
    }

    // 将合并序列复制到原始序列中
    for (k = 0, i = low; i <= high; i++, k++) 
    {
        array[i] = array2[k];
    }
}

void MergePass(int array[], int gap, int length) 
{
    int i = 0;
    // 归并gap长度的两个相邻子表
    for (i = 0; i + 2 * gap - 1 < length; i = i + 2 * gap) 
    {
        Merge(array, i, i + gap - 1, i + 2 * gap - 1);
    }
    // 余下两个子表,后者长度小于gap
    if (i + gap - 1 < length) 
    {
        Merge(array, i, i + gap - 1, length - 1);
    }
}
/*输出结果*/
void Print(int arr[],int length)
{
    for (int i=0;i<length;i++) 
         {
            cout<<arr[i]<<" ";
         }
         cout<<endl;
}
/*排序函数*/ 
int sort(int list[],int length) 
{
    for (int gap = 1; gap < length; gap = 2 * gap) 
    {
        MergePass(list, gap, length);
        cout<<"gap = "<<gap<<":  ";
         Print(list,length);
    }
}


int main()
{
    int array[]={9, 1, 5, 3, 4, 2, 6, 8, 7};
    int n=sizeof(array)/sizeof(int);
    cout<<"初始序列:"; 
    Print(array,n); 
    sort(array,n);
}

这里写图片描述

基数排序:

1.详细解释
https://www.cnblogs.com/jingmoxukong/p/4311237.html

猜你喜欢

转载自blog.csdn.net/zhaoshuling1109/article/details/80596945