zoukankan      html  css  js  c++  java
  • C语言排序系列之归并排序(2)

        归并排序的基本思想是:首先对待排序数组前 n/ 2排序,再对后n / 2排序,然后对两部分进行合并

        流程:1、若n= 1,返回

                2、对前n / 2排序

                    对后n / 2 排序

                3、合并

         时间复杂度为:O(nlgn),推导方法见http://v.163.com/special/opencourse/algorithms.html 麻省理工学院开放课 --算法导论(国外的教学真的比国内的好很多)

         

    /*归并排序:
      时间复杂度:O(nlgn)
    */
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    void MergeSort(int data[],int length)
    {
        int *tempdata;
        int i = 0;
        int nHead1 = 0;
        int nHead2 = 0;
        if(length == 1)
        {
            return;
        }
        MergeSort(data,(int)(length / 2));
        MergeSort(data + (int)(length / 2),length - (int)(length / 2));
        tempdata = (int*)malloc(length * sizeof(int));
        nHead1 = 0;
        nHead2 = length / 2;
        for(i = 0;i < length;++i)
        {
            if(nHead2 == length || ((nHead1 < (int)(length / 2)) && data[nHead1] < data[nHead2]))
            {
                tempdata[i] = data[nHead1++];
            }
            else
            {
                tempdata[i] = data[nHead2++];
            }
        }
        memcpy(data,tempdata,length * sizeof(int));
    }
    
    int main()
    {
        int data[15] = {4,7,2,6,5,9,3,8,19,11,14,12,17,20,18};
        int i = 0;
        MergeSort(data,15);
        for(i = 0;i < 15;i++)
        {
            printf("%d ",data[i]);
        }
        printf("\n");
        getchar();
        return 0;
    }
  • 相关阅读:
    剑指 Offer 25. 合并两个排序的链表
    53. 最大子序和 动态规划
    121. 买卖股票的最佳时机
    20. 有效的括号
    centos7 常用操作
    树莓派
    golang 学习笔记
    并发 线程 进程
    连接内网问题
    Lamp 高并发优化
  • 原文地址:https://www.cnblogs.com/renteng/p/2539064.html
Copyright © 2011-2022 走看看