实验目的:
通过本次实验,掌握蛮力算法的基本思想。
实验环境:
硬件:PC机
软件:windows操作系统,C语言
实验内容:
给定一个整数数组A=(a0,a1,…,an-1),若i<j且ai>aj,则<ai,aj>就为一个逆序对,例如数组(3,1,4,5,2)的逆序对有<3,1>,❤️,2>,<4,2>,<5,2>。设计一个穷举算法求A中的逆序对的个数。
实验过程:
1.算法设计
在这里我们要采用蛮力法解决求逆序对个数的问题,所以,先设置一个变量ans来记录逆序对的个数.然后设置两层for循环来依次比较每个元素与其后面的元素的大小,外层循环设置为i
= 0,则内层循环 为了避免与每个元素与自己比较,则设置为j = j + 1. 如果该元素的值大于后面元素的值,满足条件,则逆序数加一,ans ++ 否则继续循环,直到结束为止.最后输出该数组逆序对的个数.
2.程序清单
# include <stdio.h>
# include <iostream>
using namespace std;
int solve(int a[],int n)
{
// 定义一个变量来记录逆序对的个数
int ans = 0;
// 设置两层循环进行遍历
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
// 判断是否可以组成逆序对
if(a[i]>a[j])
// 条件满足,逆序数加一
ans++;
// 返回逆序数的个数
return ans;
}
int main()
{
int a[] = {3,1,4,5,2};
int n = sizeof(a)/sizeof(a[0]);
cout <<"逆序对的个数是"<<solve(a,n)<<endl;
return 0;
}
3.复杂度分析
时间复杂度
这种做法假设数组中有 n 个数字,每个数字都要和 O(n) 个数字比较,因此算法的时间复杂度是 O(n^2)
4.运行结果
实验总结:
通过这次课程设计的程序实践,我实在获益匪浅!这次的程序设计对我来说无疑是一个具大的考验,课下我就一直为实现程序而努力,翻阅相关书籍、在网上查找资料。因为开始时基础不是很好,过程中遇到了不少的阻碍,编写程序的进度也比较慢。但是通过努力,我对这次实验的原理有了一定的理解,终于写出了本次课程设计的核心算法,并使其能够正常的运行。
这次的设计工作,让我体会到了作为一个编程人员的艰难,一个算法到具体实现,再到应用层面的开发是需要有一段较长的路要走的,不是一朝一夕就可以实现的,而且在编好程序后,编程人员还要花很多的时间去完善它,其中的辛苦,很难用言语表达出来。今后,我会更加努力的学习专业知识,努力提高自我的能力。同时,也非常感谢老师上课讲授的知识!