zoukankan      html  css  js  c++  java
  • 练习友元函数,有元类,快排和全排列问题

    写了一小段代码:

    • 练习一下友元类和友元函数的声明和使用;
    • 练习一下最简单的快排算法;
    • 练习一下递归的方法处理全排列问题。

    代码:

      1 #include <stdlib.h>
      2 #include <string>
      3 
      4 class Something;
      5 
      6 // 友元函数可以提前在类外定义,也可以不这么做
      7 int get_data(Something& sth);
      8 
      9 class Otherthing;
     10 class Something
     11 {
     12 private:
     13     int data;
     14 
     15     // 友元类定义的位置在private,public,protected都可以
     16     // 友元类实现的位置在类内和类外都可以
     17     friend Otherthing;
     18 
     19     // 友元函数定义的位置在private,public,protected都可以
     20     // 友元函数实现的位置在类内和类外都可以
     21     // 即使在类内定义,也是全局可访问
     22     friend int get_data(Something& sth)
     23     {
     24         return sth.data;
     25     }
     26 public:
     27     void set_data(int v)
     28     {
     29         data = v;
     30     }
     31 };
     32 
     33 class Otherthing
     34 {
     35 public:
     36     int get_data(Something& sth)
     37     {
     38         return sth.data;
     39     }
     40 };
     41 
     42 // 交换
     43 void swap(int* p, int* q)
     44 {
     45     if(p == q)
     46         return;
     47     int tmp = *p;
     48     *p = *q;
     49     *q = tmp;
     50 }
     51 
     52 // 打印
     53 void print_array(int* begin, int* end)
     54 {
     55     while(begin < end)
     56         printf("%d ", *begin++);
     57     printf("
    ");
     58 }
     59 
     60 // 快排
     61 void quick_sort(int* begin, int* end)
     62 {
     63     if(end - begin <= 1)
     64         return;
     65 
     66     // 定义两个迭代器
     67     int* p = begin+1, * q = end-1;
     68 
     69     // 采用最常规的,选第一个元素作为中枢点的方法
     70     while(p < q)
     71     {
     72         while(p < q && *p <= *begin)    // 后移p
     73             p++;
     74         while(p < q && *q > *begin)        // 前移q
     75             q--;
     76         swap(p, q);                        // 交换p,q
     77     }
     78 
     79     // 比较中枢位置的元素和第一个元素,若逆序,则交换
     80     if(*p < *begin)
     81         swap(p, begin);
     82 
     83     // 递归调用
     84     quick_sort(begin, p);
     85     quick_sort(p, end);
     86 }
     87 
     88 void full_permutation(const char* str, char* aux, int* num, int cur, const int n)
     89 {
     90     if(n == cur)
     91     {
     92         printf("%s
    ", aux);
     93     }
     94     for(int i = 0; i < n; i++)
     95     {
     96         if(0 == num[i])            // 如果第i个字符还没有被用过
     97         {
     98             num[i] = 1;            // 标志设为1,表示该字符不能在 “后面的递归中” 再次被使用
     99             aux[cur] = str[i];    // 在cur位置使用第i个字符
    100             full_permutation(str, aux, num, cur+1, n);
    101             num[i] = 0;            // 清空标志,使该字符在 “迭代之后的递归中” 可以被使用
    102         }
    103     }
    104 }
    105 
    106 void full_permutation_aux(const char* str)
    107 {
    108     int n = strlen(str);
    109     char* aux = new char[n+1];
    110     memset(aux, 0, (n+1)*sizeof(char));
    111     int* num = new int[n];
    112     memset(num, 0, n*sizeof(int));
    113     full_permutation(str, aux, num, 0, n);
    114 }
    115 
    116 int _tmain(int argc, _TCHAR* argv[])
    117 {
    118     // 练习友元函数和有元类
    119     Something sth;
    120     sth.set_data(10);
    121     printf("%d
    ", get_data(sth));
    122     Otherthing oth;
    123     printf("%d
    ", oth.get_data(sth));
    124 
    125     // 练习快排
    126     int array[] = {6, 12, 45, 12, 78, 3, 9, 1, 89, 12, 34, 8, 18, 15};
    127     int len = sizeof(array)/sizeof(int);
    128     int* begin = array;
    129     int* end = array + len;
    130     quick_sort(begin, end);    
    131     print_array(begin, end);
    132 
    133     // 练习全排列
    134     const char* str = "ABCD";
    135     full_permutation_aux(str);
    136 
    137     system("pause");
    138     return 0;
    139 }

    输出结果:

    10
    10
    1 3 6 8 9 12 12 12 15 18 34 45 78 89
    ABCD
    ABDC
    ACBD
    ACDB
    ADBC
    ADCB
    BACD
    BADC
    BCAD
    BCDA
    BDAC
    BDCA
    CABD
    CADB
    CBAD
    CBDA
    CDAB
    CDBA
    DABC
    DACB
    DBAC
    DBCA
    DCAB
    DCBA
    请按任意键继续. . .
  • 相关阅读:
    数据持久化-- json、pickle
    socket编程介绍
    RHEL/CentOS 下安装yum源地址汇集---不定期更新
    设置阿里云pip源,加速pip更新速度
    pacemaker+corosync+haporxy高可用集群部署
    etcd数据库备份与还原
    PEM格式的证书转换格式
    CentOS 7 上 yum 安装python3
    webconsole提示undefined: ssh.InsecureIgnoreHostkey错误解决方案
    oh my zsh 配置文件
  • 原文地址:https://www.cnblogs.com/zanzan101/p/3398648.html
Copyright © 2011-2022 走看看