C++写一个排列组合小程序

今天突然想到一个问题,有时候,针对同一个事件有多种反映,特别是游戏AI当中,这种情况下需要采取最适合的方案,哪种方案最适合,可以将每种方案的结果或影响都计算一遍,从而选择最合适的。最基本就是一个排列组合方法,将各种方案都组合出来。于是写了一个基本的N个数排列组合小程序!

开发工具:Visual Studio 2012

 

CTestPermutation::~CTestPermutation()
{
    cout<<">>>>>>>>>>>>>>>>>>>>>>>>CTestPermutation::~CTestPermutation()"<<endl;
}

void CTestPermutation::DoTest()
{
    cout<<"-------将N个数进行排列组合-------"<<endl<<endl;
    vector<int> vecNums,vecPermutated;
    cout<<"示例数据:";
    for(int i = 1; i < 5;i++)
    {
        vecNums.push_back(i);
        cout<<i<<" ";
    }
    cout<<endl;
    cout<<"排列组合结果:"<<endl;
    Permutation(vecPermutated,vecNums);

}

/******************************************************
 @ FunctionNmae:            Permutation
 @ Function:                将N个数进行排列组合
 @ vecPermutated:           已经排列好的数列
 @ vecWaitPermuta:          待排列的数
********************************************************/

void CTestPermutation::Permutation(vector<int> vecPermutated,vector<int> vecWaitPermuta)
{
    if(vecWaitPermuta.size() > 0 )
    {
        for(vector<int>::iterator itNum = vecWaitPermuta.begin();itNum != vecWaitPermuta.end();++itNum)
        {
            vector<int> vecPermutatedTmp = vecPermutated;
            vecPermutatedTmp.push_back(*itNum);

            vector<int> vecWaitPermutaTmp = vecWaitPermuta;
            //删除当前已经加入排列完毕的元素
            vector<int>::iterator retFind = find(vecWaitPermutaTmp.begin(),vecWaitPermutaTmp.end(),*itNum);
            if(vecWaitPermutaTmp.end() != retFind)
            {
                vecWaitPermutaTmp.erase(retFind);
            }
            //继续递归调用排列算法
            Permutation(vecPermutatedTmp,vecWaitPermutaTmp);
        }
    }
    else //一组排列完毕
    {
        //打印排列结果
        cout<<"\t";
        for(int i = 0; i < vecPermutated.size();++i)
        {
            cout<<vecPermutated.at(i)<<" ";
        }
        cout<<endl;
    }
}

执行结果:

 

 

转载于:https://www.cnblogs.com/knight-monkey/p/Monkey_blog_201507031706.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这是一个快速排序算法的 C 语言实现: ``` void quick_sort(int arr[], int left, int right) { int i, j, pivot; if (left < right) { i = left; j = right; pivot = arr[left]; while (i < j) { while (i < j && arr[j] >= pivot) { j--; } if (i < j) { arr[i] = arr[j]; i++; } while (i < j && arr[i] < pivot) { i++; } if (i < j) { arr[j] = arr[i]; j--; } } arr[i] = pivot; quick_sort(arr, left, i - 1); quick_sort(arr, i + 1, right); } } ``` 这个算法使用了分治的思想,将数组分成两个子数组并排序。它的时间复杂度是 O(n log n),是一种非常快速的排序算法。 使用方法是:调用 quick_sort 函数并传入要排序的数组、数组的左端点和右端点。例如,如果要对数组 arr 排序,可以使用如下代码: ``` int arr[] = {3, 5, 1, 2, 4}; int n = sizeof(arr) / sizeof(int); quick_sort(arr, 0, n - 1); ``` 排序后,数组 arr 中的元素就会从小到大排序。 ### 回答2: 下面是一个使用C语言实现的快速排序算法的示例: ```c #include <stdio.h> // 交换两个元素的值 void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } // 找到基准元素应处的位置 int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = (low - 1); for (int j = low; j <= high- 1; j++) { if (arr[j] < pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return (i + 1); } // 快速排序算法 void quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } // 测试 int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr)/sizeof(arr[0]); printf("排序前的数组:\n"); for (int i=0; i < n; i++) printf("%d ", arr[i]); printf("\n"); quickSort(arr, 0, n-1); printf("排序后的数组:\n"); for (int i=0; i < n; i++) printf("%d ", arr[i]); printf("\n"); return 0; } ``` 这个示例中,`partition()` 函数用于找到基准元素应处的位置。`quickSort()` 函数用于实现递归的快速排序算法。在 `main()` 函数中,我们先定义了一个测试数组,并打印出排序前的数组。经过快速排序算法处理后,再打印出排序后的数组。运行该程序,你可以得到一个升序排列的数组。 ### 回答3: 下面是一个简单的C语言快速排序算法的实现: ```c #include <stdio.h> // 交换两个元素的值 void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } // 划分过程 int partition(int arr[], int low, int high) { int pivot = arr[high]; // 选择最后一个元素作为基准 int i = (low - 1); // 比pivot小的元素的最右边索引 for (int j = low; j <= high- 1; j++) { // 如果当前元素小于或等于pivot,就将其放在较小元素区域的右边 if (arr[j] <= pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return (i + 1); } // 快速排序函数 void quickSort(int arr[], int low, int high) { if (low < high) { // pi为划分点,将数组分为两部分的索引 int pi = partition(arr, low, high); // 递归地对划分的两部分进行排序 quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } // 打印数组 void printArray(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[] = {10, 7, 8, 9, 1, 5}; int size = sizeof(arr)/sizeof(arr[0]); // 计算数组大小 quickSort(arr, 0, size - 1); printf("排序后的数组:"); printArray(arr, size); return 0; } ``` 该快速排序算法使用了递归的方式,首先在数组中选择一个基准元素,然后通过划分过程将数组分成两个子数组,其中一个子数组的元素均比基准元素小,另一个子数组的元素均比基准元素大。然后再递归地对两个子数组进行排序。最后将所有的子数组合并起来,即可得到排好序的数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值