• 算导第二章笔记 (归并排序 之 插入排序优化)


    这一章大致介绍一些概念

    循环不变式 

    伪代码规范(极度符合Java 规则语法)

    theta 符号之类的

    主要收获: 归并排序 + 插入排序优化

    这一点是蛮不错。 n* log(n/k) max(K) = log n

    抱着不服的原则(sort至上)去试了试, 结果GG:

     1 #include <iostream>
     2 #include <bits/stdc++.h>
     3 #include <time.h>
     4 using namespace std;
     5 
     6 void InsertSort(int* A, int len) {
     7     //int len = A.size();
     8     for(int i = 2; i < len; ++i) {
     9         int j = i-1;
    10         int tmp = A[i];
    11         while(A[j] > tmp && j >= 0) {
    12             A[j+1] = A[j];
    13             j--;
    14         }
    15         A[j+1] = tmp;
    16     }
    17 }
    18 
    19 void Merge(int* A, int L1, int R1, int L2, int R2) {
    20     int Array1[R1-L1+1];
    21     int Array2[R2-L2+1];
    22     for(int i = L1; i <= R1; ++i) {
    23         Array1[i-L1] = A[i];
    24     }
    25     for(int i = L2; i <= R2; ++i) {
    26         Array2[i-L2] = A[i];
    27     }
    28     int pos1, pos2;
    29     pos1 = pos2 = 0;
    30     int cnt = L1;
    31     while(pos1 < (R1-L1+1) && pos2 < (R2-L2+1)) {
    32         if(Array1[pos1] < Array2[pos2]) A[cnt++] = Array1[pos1++];
    33         else A[cnt++] = Array2[pos2++];
    34     }
    35     while(pos1 < (R1-L1+1)) {
    36         A[cnt++] = Array1[pos1++];
    37     }
    38     while(pos2 < (R2-L2+1)) {
    39         A[cnt++] = Array2[pos2++];
    40     }
    41     //cout << "Cnt: " << cnt <<endl;
    42 }
    43 
    44 void MergeSort(int* A, int L, int R, int K) {
    45     if(L < R) {
    46         if(R - L >= K) {
    47             int p = (L + R) >> 1;
    48             MergeSort(A, L, p, K);
    49             MergeSort(A, p+1, R, K);
    50             Merge(A, L, p, p+1, R);
    51         } else {
    52             InsertSort(A, R-L+1);
    53         }
    54 
    55     }
    56 }
    57 
    58 
    59 void MergeSort2(int* A, int L, int R) {
    60     if(L < R) {
    61         int p = (L + R) >> 1;
    62         MergeSort2(A, L, p);
    63         MergeSort2(A, p+1, R);
    64         Merge(A, L, p, p+1, R);
    65 
    66     }
    67 }
    68 
    69 int Array[100000000];
    70 int main()
    71 {
    72     int size = 256 << 21; // 512MB
    73     char *p = (char*)malloc(size) + size;
    74     __asm__("movl %0, %%esp
    " :: "r"(p));
    75     //G++ stack
    76     int n = 100000000;
    77     for(int i = 0; i < n; ++i) {
    78         int tmp = int(rand() * n) % 13131;
    79         //cout << tmp <<endl;
    80         Array[i] = tmp;
    81     }
    82 
    83     clock_t Beg = clock();
    84     //MergeSort(Array, 0, n-1, 25); //  28091
    85     //MergeSort2(Array, 0, n-1); //     41302
    86     sort(Array, Array+n);    //         31347
    87     clock_t End = clock();
    88     int Dis = End - Beg;
    89     cout << "Time : " << Dis << endl;
    90    /* for(int i = 0; i < (int)Array.size(); ++i) {
    91         cout << Array[i] << " ";
    92     }*/
    93     puts("");
    94 
    95 
    96 }
  • 相关阅读:
    Java 链表
    知识点归列
    HTML和CSS必须知道的重点难点问题
    函数表达式
    javascript原型链
    canvas成长树
    checkbox选中问题
    使用vue-cli脚手架自定义iview主题
    AI学习吧-Redis操作-事务、订阅
    AI学习吧-REDIS-常识
  • 原文地址:https://www.cnblogs.com/aoxuets/p/6888142.html
Copyright © 2020-2023  润新知