zoukankan      html  css  js  c++  java
  • 排序之归并排序

     1 /*
     2 排序 之 归并排序
     3 T(n) = O(nlogn)
     4 通过分治思想,将数组不断二分
     5 最后通过合并两组数据(合并数据时间复杂度为O(n))递归实现排序
     6 不论什么情况,时间复杂度都为O(nlogn)
     7 但是注意付出了开辟空间(t[maxn])的代价
     8  */
     9 #include <iostream>
    10 using namespace std;
    11 const int maxn = 5;
    12 int a[maxn] = {5, 4, 3, 2, 1},t[maxn];
    13 void merge(int a[], int l, int m, int r)//合并a[l,m]和a[m+1,r]这两组数据
    14 {
    15     int i = l, j = m + 1, x = m, y = r, k = 0;
    16     while(i <= x && j <= y)//当a[l,m]或者a[m+1,r]任意一组填完退出
    17         if(a[i] < a[j]) t[k++] = a[i++];
    18         else t[k++] = a[j++];
    19     while(i <= x) t[k++] = a[i++];//剩下的都是比前面大的,直接填
    20     while(j <= y) t[k++] = a[j++];
    21     for(int i = 0; i < k; ++i)//将排好序的数覆盖原来位置
    22         a[l+i] = t[i];
    23 }
    24 void merge_sort(int a[],int l,int r)
    25 {
    26     if(l >= r) return;
    27     int m = (l+r)/2;
    28     merge_sort(a,l,m);//排序左半边
    29     merge_sort(a,m+1,r);//排序右半边
    30     merge(a,l,m,r);//合并两组数据
    31 }
    32 void print()
    33 {
    34     for(int i = 0; i < maxn; ++i)
    35         cout << a[i] << " ";
    36     cout << endl;
    37 }
    38 int main()
    39 {
    40     print();
    41     merge_sort(a,0,maxn-1);
    42     print();
    43     return 0;
    44 }
  • 相关阅读:
    textarea输入字符有限制
    linux 简单命令
    jQuery animate()
    两张图切换
    表单验证 靠name获取
    jquery验证手机号码
    倒计时
    锚点链接 阻止a标签跳转
    滚动监听: bootstrap 的scrollspy
    MySQL 02
  • 原文地址:https://www.cnblogs.com/qq188380780/p/7282142.html
Copyright © 2011-2022 走看看