排序算法总结

(一)选择排序

(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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值