目录
(一)选择排序
(1)选择排序思想
首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾(目前已被排序的序列)。以此类推,直到所有元素均排序完毕。
(2)选择排序算法
#include"iostream"
#include"algorithm"
using namespace std;
int main()
{
int a[50]={0},n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n-1;i++)
{
int k=i;
for(int j=i+1;j<n;j++)
{
if(a[k]>a[j])
{
k=j;
}
}
if(k!=i)
swap(a[k],a[i]);
}
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
(二)冒泡排序
(1)冒泡排序思想
两两进行比较,每次排序选出最大的放到最后。
(2)冒泡排序算法
#include"iostream"
#include"algorithm"
using namespace std;
int main()
{
int a[50],n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
swap(a[j],a[j+1]);
}
}
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
(三)直接插入排序
(1)直接插入排序思想
直接插入插排的基本思想是:当插入第i(i >= 1)时,前面的V[0],V[1],……,V[i-1]已经排好序。这时,用V[I]的排序码与V[i-1],V[i-2],…的排序码顺序进行比较,找到插入位置即将V[i]插入,原来位置上的元素向后顺移。
(2)直接插入排序算法
#include"iostream"
#include"algorithm"
using namespace std;
int main()
{
int a[50]={0},n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=1;i<n;i++)
{
int k=a[i];
int j=i;
while (j>0)
{
if(a[j-1]>k)
{
a[j]=a[j-1];
j--;
}
else
{
break;
}
}
a[j]=k;
}
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
(四)归并排序
(1)归并排序思想
归并排序主要运用了二分法的思路,它属于稳定排序算法,时间复杂度较低。归并算法的时间复杂度为O(nlog2^n)。
(2)算法应用:求逆序对
在合并的过程中是将两个相邻并且有序的序列合并成一个有序序列。如以下两个有序序列。
序列1:2 6 5
序列2:6 4 9 8
对于序列1中的某个数a[i],序列2中的某个数a[j],如果a[i]<a[j],没有逆序数,如果a[i]>a[j],那么逆序数为1中a[i]后边元素的个数(包括a[i]),即len1-i+1。
这样累加每次递归过程的逆序数,在完成整个递归过程之后,最后的累加和就是逆序的总数。
#include"iostream"
#include"algorithm"
#define maxn 500005
using namespace std;
int a[maxn];
int temp[maxn];
int ans=0;
void gb(int l,int r)
{
if(l==r)
return;
int mid=(l+r)>>1;
gb(l,mid);
gb(mid+1,r);
int i=l,j=mid+1;
int cnt=l;
while(i<=mid&&j<=r)
{
if(a[i]>a[j])
{
temp[cnt++]=a[j++];//此语句用来求逆序对,如果删除此语句即为归并排序算法
ans=ans+mid-i+1;
}
else
{
temp[cnt++]=a[i++];
}
}
while(i<=mid)
temp[cnt++]=a[i++];
while(j<=r)
temp[cnt++]=a[j++];
for(int i=l;i<=r;i++)
a[i]=temp[i];
}
int main()
{
int n;
cin>>n;
for (int i=1;i<=n;i++)
{
cin>>a[i];
}
gb(1,n);
/*for (int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}*/ //此输出为归并排序输出
cout<<endl;
cout<<ans;
}
注:常用的代码表示:(1)x >> 1 == x / 2
(2) x << 1 == x * 2
(3)x << 1|1 == x * 2 + 1