目录
1 冒泡排序法
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
#include <bits/stdc++.h>
using namespace std;
int a[99999];
int n;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)//循环n次
{
for(int j=1;j<n;j++)
{
if(a[j]<a[j-1]) swap(a[j],a[j-1]);
}
}
for(int i=0;i<n;i++)
{
cout<<a[i]<<' ';
}
return 0;
}
下面列举一道冒泡排序的原理题:
考虑冒泡排序的复杂度,对于拥有N个字母的字符串,最多需要交换N*(N-1)/2次(完全乱序时) 易知N=15时,有15*14/2=105,即满足100次交换所需的最短字符串有15个字母。 要求字典序最小,那么显然要取a~o这15个字典序最小的字母逆向思考,目标字符串经过100次交换后,得到正序字符串abcdefghijklmno,而完全逆序的字符串onmlkjihgfedcba变成正序字符串需要105次交换,那么将完全逆序的字符串交换5次后,便能得到答案。 而要求字典序最小,那么将j交换5次提到字符串最前面,就得到了最小的情况
2 二分查找法
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
#include <bits/stdc++.h>
using namespace std;
int a[99999],l,r,mid,n,target;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
cin>>target;
l=1;
r=n;
while(l<=r)
{
mid=(l+r)/2;
if(a[mid]>target) r=mid-1;
if(a[mid]==target)
{
cout<<mid;
return 0;
}
if(a[mid]<target) l=mid+1;
}
cout<<"INF";
return 0;
}