开发者社区> 问答> 正文

数据结构,设待排序文件的初始排序码序列为{28,55,36,05,43,24,62,17},写出采用归并排序算法排序

每趟结束时的状态。请高手写一下,谢谢。

展开
收起
知与谁同 2018-07-22 09:12:32 2274 0
2 条回答
写回答
取消 提交回答
  • 杀人者,打虎武松也。

    /*

    设置的步长不同,每趟的结束就不同

    步长为1时:答案如图

    */

    #include <iostream>

    #include <ctime>

    #include <cstring>

    using namespace std;

    /**将a开头的长为length的数组和b开头长为right的数组 合并 n为数组长度,用于最后一组 */

    void Merge(int* data, int a, int b, int length, int n)

    {

        int right;

        if(b+length-1 >= n-1)

            right = n-b;

        else right = length;

        int* temp = new int[length+right];

        int i = 0, j = 0;

        while(i<=length-1&&j<=right-1)

        {

            if(data[a+i] <= data[b+j])

            {

                temp[i+j] = data[a+i];

                i++;

            }

            else

            {

                temp[i+j] = data[b+j];

                j++;

            }

        }

        if(j == right)

        {

            // a中还有元素,且全都比b中的大,a[i]还未使用   

            memcpy(data+a+i+j, data+a+i,(length-i)*sizeof(int));

        }

        memcpy(data+a, temp, (i+j)*sizeof(int) );

        delete temp;

    }

    void MergeSort(int* data, int n)

    {

        int step = 1;

        while(step < n)

        {

            for(int i = 0; i <= n-step-1; i += 2*step)

                Merge(data, i, i+step, step, n);

            // 将i和i+step这两个有序序列进行合并   // 序列长度为step   // 当i以后的长度小于或者等于step时,退出   

            step *= 2;

    for(int j = 0; j < n; j++)

    {

    cout<<data[j]<<" "; 

    }

    cout<< endl;

        }

    }

    int main()

    {

        int n;

        cin >> n;

        int *data = new int[n];

        if(!data) exit(1);

        int k = n;

        while(k --)

        {

            cin >> data[n-k-1];

        }

        clock_t s = clock();

        MergeSort(data, n);

        clock_t e = clock();

        k = n;

        while(k --)

        {

            cout << data[n-k-1] << ' ';

        }

        cout << endl;

        cout << "the algrothem used " << e-s << " miliseconds."<< endl;

        delete data;

        return 0;

    }

    2019-07-17 22:51:02
    赞同 展开评论 打赏
  • 归并排序,就是先两个两个比较,在四个四个比较,以此类推
    初始:28,55,36,05,43,24,62,17
    第一趟:28,55,05,36,24,43,17,62
    第二趟:05,28,36,55,17,24,43,62
    第三趟:05,17,24,28,36,43,55,62

    数据结构书上应该有算法的消息解析吧。这个算法其实采用的是分治法,学了算法分析以后理解起来会更容易一些。
    2019-07-17 22:51:02
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
数据+算法定义新世界 立即下载
袋鼠云基于实时计算的反黄牛算法 立即下载
Alink:基于Apache Flink的算法平台 立即下载